opencv,用摄像头识别贴片元件的定位和元件的角度(转载)

博主分享了通过学习OpenCV半个月后的成果,利用摄像头实现贴片元件的定位及角度识别,详细内容来源于https://www.cnblogs.com/yuanhuang32/p/10825628.html。
摘要由CSDN通过智能技术生成

经过半个月学习opencv有点小成果,用摄像头识别贴片元件的定位和元件的角度(转载)

  (2013-04-17 16:00:22)
  分类: 学习笔记
先说一下
开源的opencv真是一件伟大的产品,
那么多个函数跟变量(具体多少还没数过),要是结合起来综合运用几乎可以胜
任任何有关图像识别和处理方面的工作。。如果能更深入一点根据具体需要修改或优
化里面的源码那更是如虎添翼。。

花了点时间浏览了www.opencv.org.cn论坛里的所有贴子,还好不多才200多页ÿ
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言: 开源的opencv真是一件伟大的产品,那么多个函数跟变量(具体多少还没数过)。要是结合起来综合运用几乎可以胜任任何有关图像识别和处理方面的工作。如果能更深入一点根据具体需要修改或优化里面的源码那更是如虎添翼。 花了点时间浏览了www.opencv.org.cn论坛里的所有贴子,还好不多才200多页。总体上对opencv里的一些常用函数功能作用大致有点了解,筛选一些跟元件识别有关的运用内容,但它论坛里的贴子回复的内容点到即止的居多。从网上下载了能搜到的教程跟代码全学习了解测试了一下,图像处理流程通常先开始都是要进行滤波,除燥,灰度,二值化后再轮廓识别等。 开始动手 经过多次好多次运行测试组合,终于有一次显示出意外的惊人效果,而且相当简单只是调用了几个函数而以,就可以有这样效果实在出人意料。第一个是进行元件中心点获取,也是直接调用函数再加点东西就可以得出元件的四个矩形顶点坐标,有这几个坐标就可以直接算出元件中间点所在的坐标了。如果要检测元件摆放角度是否是垂直90度,只要判断边宽的长度为最小或最大时就是垂直90度。 但这个矩形框无法测出元件具体角度。如截图: 测试视频地址:https://v.youku.com/v_show/id_XMjU5NzY5NTI0.html 不过,还有另外一个函数可以提供这个功能,调用后可以直接求出最小外接矩形和角度 如截图: 测试视频地址:https://v.youku.com/v_show/id_XMjYwMDMzMDc2.html 说明:里面的光源不行,临时用手电筒,和在光盘上插几个LED做环形灯做照明,无法做到无阴影显示。如果光源做的好,效果应该是非常精确稳定。 识别包含下面2种做法: opencv里需要的头文件跟库文件都已编译好放在和设置在当前程序目录下,就可不用安装opencv 也能直接编译。
好的,这个问题涉及到比较多的内容,我会尽量详细地回答。 首先,需要明确的是,OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了许多图像处理和计算机视觉方面的功能,包括图像读写、图像处理、特征提取、物体检测等等。在这个问题中,我们需要使用 OpenCV 来进行摄像头实时获取图像,并对图像进行处理,识别定位和追踪蓝色物体。 下面是一个基于 OpenCV 的 C++ 代码示例,可以实现对蓝色物体的识别定位和追踪: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 打开摄像头 VideoCapture cap(0); // 判断是否成功打开摄像头 if (!cap.isOpened()) { cout << "Error: Could not open camera." << endl; return -1; } // 定义蓝色的范围(HSV颜色空间) Scalar lower_blue = Scalar(100, 100, 50); Scalar upper_blue = Scalar(130, 255, 255); // 创建窗口 namedWindow("Blue Object Tracking", WINDOW_AUTOSIZE); while (true) { // 读取当前帧 Mat frame; cap.read(frame); // 将当前帧转换到 HSV 颜色空间 Mat hsv; cvtColor(frame, hsv, COLOR_BGR2HSV); // 进行颜色过滤,获取蓝色物体的二值图像 Mat mask; inRange(hsv, lower_blue, upper_blue, mask); // 对二值图像进行形态学开操作,去掉噪点 Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5)); morphologyEx(mask, mask, MORPH_OPEN, kernel); // 进行轮廓检测,获取蓝色物体的轮廓 vector<vector<Point>> contours; findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 遍历轮廓,绘制矩形框,并标出物体中心位置 for (vector<Point> contour : contours) { Rect rect = boundingRect(contour); rectangle(frame, rect, Scalar(0, 0, 255), 2); Point center(rect.x + rect.width / 2, rect.y + rect.height / 2); circle(frame, center, 2, Scalar(0, 255, 0), -1); putText(frame, "Blue Object", center, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255), 2); } // 显示当前帧 imshow("Blue Object Tracking", frame); // 等待按下 ESC 键退出程序 if (waitKey(30) == 27) { break; } } // 释放摄像头 cap.release(); // 关闭窗口 destroyAllWindows(); return 0; } ``` 以上代码中,我们首先创建了一个 VideoCapture 对象,打开了默认的摄像头,并判断是否成功打开。然后,我们定义了蓝色的范围(在 HSV 颜色空间中),创建了一个窗口用于显示图像。 接下来,在一个循环中,我们不断读取摄像头的当前帧,将其转换到 HSV 颜色空间,并进行颜色过滤,获取蓝色物体的二值图像。然后,我们对二值图像进行形态学开操作,去掉噪点,并进行轮廓检测,获取蓝色物体的轮廓。最后,我们遍历轮廓,绘制矩形框,并标出物体中心位置。 在显示图像时,我们使用了 OpenCV 中的 imshow 函数。在等待按下 ESC 键退出程序时,我们使用了 OpenCV 中的 waitKey 函数。 最后,我们需要根据实际需求,添加界面元素,例如按钮、滑块等等,以实现更加友好的用户界面。可以使用 Qt、MFC 等 GUI 库来实现界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值