如何使用OpenCV实现基于标记的定位(为什么对标记检测能够实现定位)

前言:工程应用中时常用到视觉定位,比如电路板上都会预留一个定位点,便于设备识别坐标位置,便于SMT机器判断该将电子元器件贴到哪个位置。对于摄像头测试也是如此,测试手机或平板摄像头,通常会选一张固定的图纸,然后根据所拍摄的图片进行分析。由于环境存在误差,对图片不能千篇一律的按照固定位置解析,总是存在一定的角度倾斜,所以解析图片前,先进行视觉定位是必须要做的一步。本文通过OpenCV 开源图像库实现圆形的坐标定位来示例计算机视觉在工程中的实际应用。

方法/步骤

1

准备一张示例图片,如图示,图片中存在方形,多变形,不规则图形,圆形,且颜色各异。 下面介绍如何定位图中的两个圆。此图片大家可以使用windows自带的小画家来画,注意画圆的时候按shift键可以画出正圆。

如何使用OpenCV实现基于标记的定位










2

引用OpenCV 头文件和库文件,并且包含vector, 后面要用到。

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>

#include <stdio.h>

#include <vector>

#include <math.h>

#pragma comment (lib,"opencv_core244d.lib")

#pragma comment (lib,"opencv_highgui244d.lib")

#pragma comment (lib,"opencv_imgproc244d.lib")

using namespace std;

using namespace cv;


3

加载待处理图片,为了便于显示,对图片进行缩放,其实缩放这个小技巧还可以提高后续的处理速度。然后对图片进行灰度处理,然后对图片记性二值化处理,去掉饱和度较低的部分,利用HoughCircles函数,提取轮廓为圆的部分。

注意调整HoughCirles函数的几个参数,可以抓到不同的结果,要耐心根据实际情况调整。

Mat resized;

resize(src,resized,Size(src.cols/ratio,src.rows/ratio));

int w=resized.size().width;

int h=resized.size().height;

Mat gray;

cvtColor(resized,gray,CV_BGR2GRAY);

blur(gray,gray,Size(3,3));

threshold(gray,gray,160,255,THRESH_BINARY_INV);

blur(gray,gray,Size(3,3));

vector<Vec3f> circles;

HoughCircles(gray,circles,CV_HOUGH_GRADIENT,2,h/4,25,100,h/32,h/8);

vector<Vec3f>::const_iterator it=circles.begin();

while(it!=circles.end())

{

circle(resized,Point((*it)[0],(*it)[1]),2,Scalar(0,0,255),2);

circle(resized,Point((*it)[0],(*it)[1]),(*it)[2],Scalar(0,0,255),2);

++it;

}

namedWindow("src");

imshow("src",resized);

namedWindow("resized");

imshow("resized",gray);

waitKey(0);





















4代码解读:

使用HoughCircles必须注意,传入的第一个参数必须是灰度图,根据需要设置其参数,参数2 :累加器分辨率, 参数3: 两个圆之间的最小距离,参数4:Canny 高阀值,参数5:最小投票数,参数6,7:最小,最大半径。

函数抓取的圆保存到向量circles中, Vec3f 是个3个变量的结构体Vec3f[0] ,Vec3f[1] 对应圆心坐标值,Vec3f[2] 对应圆心半径。 

为了显示结果, 使用circle函数画出圆心和圆,颜色使用红色。


5

但是摄像头拍照不比电脑作图,实际拍照会受光照条件和强度的影响,导致抓取结果偏差很大。 如下图,实际拍摄的图可能有阴影投射,灰度处理后影响值得抓取。使用上述代码,却抓到了7个圆,实际只需要左右2个,所以可以根据坐标将不需要的过滤掉。

如何使用OpenCV实现基于标记的定位
如何使用OpenCV实现基于标记的定位




























6

实际基于标记的坐标定位也可使用如下的图形进行实现,该图解析出来后不但能够识别坐标,还可判断方向,实际开发中,下图会转化为海明码进行分析。

以上,如帮到读者,请投宝贵一票,谢谢。

如何使用OpenCV实现基于标记的定位

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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 也能直接编译。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值