用opencv 实现 halcon 卡尺工具
时间: 2023-07-12 22:35:20 浏览: 214
在OpenCV中,可以使用cv::findContours函数和cv::minAreaRect函数来实现Halcon卡尺工具的功能。具体实现步骤如下:
1. 将待测图像加载到OpenCV中。
2. 对待测图像进行二值化处理,得到二值化图像。
3. 使用cv::findContours函数在二值化图像中找到所有轮廓。
4. 对所有轮廓使用cv::minAreaRect函数计算最小外接矩形。
5. 对所有最小外接矩形进行排序,并选择最长的两个矩形作为卡尺。
6. 根据卡尺的位置和方向在原始待测图像中画出卡尺线段和端点。
以下是代码示例:
```
// 加载待测图像
cv::Mat srcImage = cv::imread("srcImage.jpg");
// 对待测图像进行二值化处理
cv::Mat binaryImage;
cv::cvtColor(srcImage, binaryImage, cv::COLOR_BGR2GRAY);
cv::threshold(binaryImage, binaryImage, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
// 查找所有轮廓
std::vector<std::vector<cv::Point>> contours;
cv::findContours(binaryImage, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 计算所有轮廓的最小外接矩形
std::vector<cv::RotatedRect> rects;
for (size_t i = 0; i < contours.size(); i++) {
cv::RotatedRect rect = cv::minAreaRect(contours[i]);
rects.push_back(rect);
}
// 对最小外接矩形按长宽比排序,选择最长的两个矩形作为卡尺
std::sort(rects.begin(), rects.end(), [](const cv::RotatedRect& rect1, const cv::RotatedRect& rect2) {
return std::max(rect1.size.width, rect1.size.height) > std::max(rect2.size.width, rect2.size.height);
});
cv::RotatedRect caliper1 = rects[0];
cv::RotatedRect caliper2 = rects[1];
// 计算卡尺的位置和方向
cv::Point2f pt1[4];
caliper1.points(pt1);
cv::Point2f pt2[4];
caliper2.points(pt2);
cv::Point2f midPt1 = (pt1[0] + pt1[1] + pt1[2] + pt1[3]) / 4;
cv::Point2f midPt2 = (pt2[0] + pt2[1] + pt2[2] + pt2[3]) / 4;
double angle = atan2(midPt2.y - midPt1.y, midPt2.x - midPt1.x) * 180 / CV_PI;
// 在原始待测图像中画出卡尺线段和端点
cv::line(srcImage, pt1[0], pt1[2], cv::Scalar(0, 0, 255), 2);
cv::line(srcImage, pt2[0], pt2[2], cv::Scalar(0, 0, 255), 2);
cv::circle(srcImage, midPt1, 3, cv::Scalar(0, 255, 0), -1);
cv::circle(srcImage, midPt2, 3, cv::Scalar(0, 255, 0), -1);
// 显示结果图像
cv::imshow("Result", srcImage);
cv::waitKey(0);
```
需要说明的是,以上代码示例仅为实现Halcon卡尺工具的思路示例,具体实现还需要根据具体应用场景进行调整和优化。
阅读全文