用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点集合时,遍历矩形的起始点

搞定收工!!!

### 实现卡尺功能的方法 在OpenCV实现卡尺功能主要依赖于边缘检测和几何形状分析。对于圆形物体的识别,通常采用霍夫变换圆检测或者轮廓检测的方式。下面具体说明如何使用这些技术来完成类似于卡尺的功能。 #### 使用霍夫变换进行圆检测 霍夫变换是一种用于图像处理中的特征提取技术,在这里主要用于寻找图片中存在的圆形对象。可以通过调整参数使得该算法更加适用于不同场景下的圆周定位需求[^1]。 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main(){ Mat src, gray; vector<Vec3f> circles; // 加载原始图像并转换成灰度图 src = imread("path_to_image"); cvtColor(src, gray, COLOR_BGR2GRAY); // 应用高斯模糊减少噪声影响 GaussianBlur(gray, gray, Size(9, 9), 2, 2); HoughCircles(gray, circles, HOUGH_GRADIENT, 1, gray.rows / 8, // change this value to detect circles with different distances to each other 100, 30, 1, 30); // minRadius & maxRadius for (size_t i = 0; i < circles.size(); ++i){ Vec3i c = circles[i]; Point center(c[0], c[1]); int radius = c[2]; circle(src, center, 1, Scalar(0, 255, 0), 3, LINE_AA); circle(src, center, radius, Scalar(0, 0, 255), 3, LINE_AA); } imshow("detected circles", src); waitKey(); } ``` 这段代码展示了怎样加载一张彩色照片作为输入源文件,并对其进行必要的预处理之后执行霍夫变换以找到所有的可能存在的圆心位置及其半径大小;最后再把这些信息绘制回原图之上以便观察效果。 #### 轮廓检测与拟合椭圆 另一种方式则是先找出所有封闭区域内的边界点集合——即所谓的“轮廓”,然后再尝试从中挑选出最接近理想形态的那个部分来进行进一步计算。这种方法特别适合那些并非完美正圆的目标物体检测任务。 ```python import numpy as np import cv2 img = cv2.imread('image_path') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,binary=cv2.threshold(gray ,127,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU) contours,hierarchy=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2:] for cnt in contours: ellipse = cv2.fitEllipse(cnt) img = cv2.ellipse(img,ellipse,(0,255,0),2) cv2.imshow("Image", img) cv2.waitKey() ``` 上述Python脚本演示了如何读入一幅二值化后的黑白影像资料,接着运用`findContours()`函数获取其中每一个独立连通域对应的外接矩形框坐标集合作为候选样本群组之一;随后借助内置工具包里的`fitEllipse()`接口求得最佳匹配椭圆模型参数组合,从而达到近似模拟真实世界里不规则图形的目的[^2]。 ### 结论 综上所述,无论是采取哪种途径去解决问题,都需要充分考虑到实际应用场景的具体特点才能获得满意的结果。而当涉及到更复杂的测量工作时,则建议考虑引入专门设计用来解决此类难题的专业级软件平台如HALCON所提供的高级特性支持[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值