用OPENCV,C++实现直线卡尺工具原理,一步到位

卡尺工具实现步骤

不多逼逼,直接上步骤

Step1:根据给定的卡尺数,计算直线上的间断点,并保留间断点的位置,并返回。

Step2:在间断上生成若干个矩形卡尺工具,与直线垂直:

Step3:计算每个卡尺矩形的内部点位集合,存放在二维数组里,如图。从起始点进行遍历,沿着两个方向遍历。

Step4:遍历上面计算的点集合,在图片上将对应的像素保存在Mat对象中。上面的点集合计算结果是亚像素,因此需要进行插值。插值示意图如下:

以计算P点位置的像素为例, f(x,y)表示位置上的像素值, 计算方式如下:

P0 = f(1,0) * dis_x1 + f(0,0) * dis_x0;P1 = f(1,1) * dis_x1 + f(0,1) * dis_x0;

则P = P0 * dis_y0 + P1 * dis_y1;

Step5:对ROI图进行垂直投影,定位边缘点在ROI上的X值,Y值边取ROI宽度的一半,如图:

Step6:得到了ROI上边缘点的位置,要映射回原图上。最后根据找到点进行拟合直线。

实操

卡尺位置:

根据卡尺位置截图:

垂直投影:

一维数组放大图:

边缘处理:

最后提取边缘点X位置,映射到原图位置上,如下图。红色点是找到边缘点。蓝色点是计算ROI点集合时,遍历矩形的起始点

搞定收工!!!

Halcon卡尺工具是机器视觉中常用的工具之一,而OpenCV也是常用的计算机视觉库。下面简单介绍如何在C++中使用OpenCV实现Halcon卡尺工具。 1. 首先,需要导入OpenCV头文件: ``` #include <opencv2/opencv.hpp> ``` 2. 接下来,需要读取图像并将其转换为灰度图像: ``` cv::Mat srcImg = cv::imread("image.jpg"); cv::Mat grayImg; cv::cvtColor(srcImg, grayImg, cv::COLOR_BGR2GRAY); ``` 3. 然后,需要定义卡尺工具的参数。Halcon卡尺工具主要包括起点、方向、长度、宽度等参数。在OpenCV中,可以通过定义两个点来表示起点和终点,并通过一些数值来定义卡尺工具的其他参数: ``` cv::Point2f startPoint(100, 100); cv::Point2f endPoint(300, 300); int length = 200; int width = 10; ``` 4. 接下来,可以利用OpenCV的线段函数画出卡尺工具: ``` cv::line(srcImg, startPoint, endPoint, cv::Scalar(0, 0, 255), width); ``` 5. 最后,可以使用OpenCV的几何变换函数进行卡尺工具的旋转和缩放: ``` cv::Point2f center(startPoint.x + length / 2, startPoint.y + width / 2); double angle = 45; double scale = 0.5; cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, scale); cv::warpAffine(srcImg, srcImg, rotationMatrix, srcImg.size()); ``` 这样,就可以在OpenCV实现Halcon卡尺工具了。完整代码如下: ``` #include <opencv2/opencv.hpp> int main() { cv::Mat srcImg = cv::imread("image.jpg"); cv::Mat grayImg; cv::cvtColor(srcImg, grayImg, cv::COLOR_BGR2GRAY); cv::Point2f startPoint(100, 100); cv::Point2f endPoint(300, 300); int length = 200; int width = 10; cv::line(srcImg, startPoint, endPoint, cv::Scalar(0, 0, 255), width); cv::Point2f center(startPoint.x + length / 2, startPoint.y + width / 2); double angle = 45; double scale = 0.5; cv::Mat rotationMatrix = cv::getRotationMatrix2D(center, angle, scale); cv::warpAffine(srcImg, srcImg, rotationMatrix, srcImg.size()); cv::imshow("result", srcImg); cv::waitKey(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值