一、发文初衷
在贴片机研发中,圆形识别是一个非常重要的课题,PCB的mark识别,BGA芯片对位的焊盘识别,带料的孔洞识别,吸嘴对准识别,换吸嘴机构定位识别,等等不胜枚举的场景中,都要用的圆形识别,圆形识别重要性可见一斑。
“别人一开源,我们就自主”的无耻之徒,让有开源信仰的人们,深恶痛绝。“弯道超车”的谎言,就像皇帝新衣一样,丑陋愚蠢。没有踏踏实实基础科学研究,怎么可能拥有创新超车的能力。正如opencv库一样,对图像数学建模能力和计算机编程能力有超高的要求,这样的人才应该是我们尊重和崇拜的对象,更应该对这种开源无私的精神加以保护。但遗憾的是,带着金丝边眼镜的叫兽们,却二次封装opencv后,到处兜售,以“guo产”、“自研”,“love国”道德绑架,脑满肠肥的外表,致命地腐蚀着对我们科研的发展进步。
二、应用场景
如图所示,PCB的Mark点,吸嘴,BGA焊盘,元件编带,贴片机点位螺丝,等等,都有圆形状元素,opencv视觉库对应此类需求,非常简单就可实现。
三、opencv算法过程
本文以元件料带的圆孔为例,一般料带孔据为4mm,只要我们识别到料带孔位置,我们可以准确推算出元件的位置。
1、读取图像并转灰
//读取图像
cv::Mat src;
src = cv::imread("tape.jpg");
//图像转灰度
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY); // 灰度化
2、中值滤波
//中值滤波
cv::Mat median;
cv::medianBlur(gray, median, 3); // 中值滤波去除噪声
3、边缘检测
//边缘检测
Mat edges;
cv::Canny(median, edges, 100, 200, 3, false);
imshow("edges", edges);
4、高斯滤波
//高斯滤波
Mat gaussian;
cv::GaussianBlur(edges,gaussian,cv::Size(5,5),0);
imshow("gaussian", gaussian);
5、霍夫圆检测
//霍夫圆检测 1, 50, 80, 80, 50, 200
std::vector<Vec3f> pcircles;
cv::HoughCircles(gaussian, pcircles, CV_HOUGH_GRADIENT, 1,
10,
80,20,
15,
25);
6、画出检测圆
for (size_t i = 0; i < pcircles.size(); i++) {
Vec3f cc = pcircles[i];
//画圆
circle(src, Point(cc[0], cc[1]), cc[2], Scalar(0,0,255), 1, LINE_AA);
qDebug()<<"radiues="<< cc[2];
//画圆心
circle(src, Point(cc[0], cc[1]), 2, Scalar(127,255,127), 1, LINE_AA);
}
imshow("src", src);
图中为灰度处理的料带,边缘检测,霍夫圆检测的三个截图
这种圆形检测方法,具有普遍适用性,只要稍微调整,即可完成不同场合圆形检测。opencv的视觉库非常强大,还有很多有用的功能,可以应用于贴片机视觉识别中。