论文中介绍的是点胶机的焊点定位,对于图像坐标和世界坐标,世界坐标和机器人坐标之间的标定由于设备限制没有完成,现记录焊点的定位。论文中的电路板电路和焊点比较简易,容易进行图像处理。
步骤:
- 获取图像、背景与前景目标的对比度尽量大;
- 图像预处理、阈值分割;
- 形态学开操作:去除电路部分,留下焊点;
- 最小矩形拟合,获取焊点中心点。(应该比轮廓质心获取更快和简便)
认识了一个新的标记函数:drawMarker()函数
对于想要使用什么样的图形来标记点可以通过更改第四个参数的值选择,这里使用0—十字叉标记。
代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
Mat src = imread("D:/images/dianjiao.jpg");
Mat gray, binary, dst;
cvtColor(src, gray, COLOR_BGR2GRAY);
threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7));
morphologyEx(binary, dst, MORPH_OPEN,kernel,Point(-1,-1),2);
//计算质心
vector<vector<Point>>con;
vector<Point>point;
findContours(dst, con, RETR_TREE, CHAIN_APPROX_SIMPLE);
int N = con.size();
cout << N << endl;
for (int i = 0; i < N; i++) {
RotatedRect rect = minAreaRect(con[i]);
point.push_back(rect.center);
}
for (int i = 0; i < point.size(); i++) {
drawMarker(src, point[i], Scalar(0, 0, 255),MARKER_CROSS, 20, 1, 8);
}
imshow("src", src);
imshow("binary", binary);
imshow("dst", dst);
waitKey(0);
return 0;
}
结果: