基于OpenCV实现,仿Halcon卡尺工具

最近实现了一下卡尺定位的工具,在这里分享一些过程中遇到的一些问题和解决方法

首先,原理

 沿着我们确定好的方向采样后就会得到一个NxM(宽x长)大小的图,对这个图我们进行投影得到一个1xM大小的图,这里投影及一阶导数是这样子的(红色即待求亚像素位置):

 

一开始做到这里的时候提取像素级坐标是没问题的,但尝试用拟合二次函数的方法计算亚像素坐标时候总是有偏差。一开始以为是双线性插值的精度不够,尝试了双三次插值后结果还是一样。

最后在查阅VisionPro相关资料后,资料中给出的插值方式如下:

 P1、P2、P3、P4为邻近四个像素,a、b、c、d为待插值坐标距离邻近像素中心位置距离,绿点所表示的像素值可由下面公式计算得出

(1-a)(p2\times (1-b)+p1\times b)+a\times (p3\times (1-b)+p4\times b)

至此算法核心部分问题已解决,剩下便可以根据原理计算出亚像素坐标,附效果图

感谢@yixiaopao的指正,源代码92行为图像分配了不正确的长度,应该把*sizeof(float_t)删掉;不过不删的话也不会造成泄露。

开发不易,请作者喝杯咖啡!感谢(拜托下载前自己先看一下,头文件私信我获取)

再次声明下,代码不包括拖拽等你想象的功能(从文件大小也能看的出来),请谨慎下载,毕竟原理都已说明白了,私信与我交流想自己实现的我也已经尽量回复了。

源代码下载链接https://download.csdn.net/download/qq_37299618/36451540icon-default.png?t=N7T8https://download.csdn.net/download/qq_37299618/36451540

  • 13
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 96
    评论
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; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 96
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zzzzzzzzzzzzzz---

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值