关于寻找图形的轮廓,想来大家都不陌生。但平常寻找并进行识别的轮廓都是较为标准的图形,如圆形,矩形等。但在一些特殊情况下,我们所检测的图形并不是理想的标准图形。比如说我们检测元件的引脚,由于各种环境因素及打光条件。拍摄出来的图像并不尽人意。这时我们需要判断引脚的坐标(轮廓的中心)及其角度偏差是否满足合格的标准。
对于这种情况,我想到的方法是对不规则轮廓外接最小旋转矩形。其矩形的中心坐标和角度就是我们所需要的数据。
具体代码如下:
Mat img = imread("Dtest2.bmp");
vector<cv::Point> Dpoint;
double angle;
Mat bw;
bool dRet;
cvtColor(img, bw, COLOR_BGR2GRAY);
threshold(bw, bw, 150, 255, CV_THRESH_BINARY);
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
vector<double>angles;
findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
for (size_t i = 0; i < contours.size(); ++i)
{
double area = contourArea(contours[i]);
if (area < 1e2 || 1e5 < area) continue;
drawContours(img, contours, i, CV_RGB(255, 0, 0), 2, 8, hierarchy, 0);
Point2f* pos = new Point2f();
double dOrient = getOrientation(contours[i], *pos, img);
if (dOrient < 0)
{
angle = -dOrient * 90;
}
else
{
angle = 90 - (dOrient * 90);
}
转换轮廓,并获得极值
for (size_t j = 0; j < contours[i].size(); j++)
contours[i][j] = GetPointAfterRotate(contours[i][j], (Point)*pos, dOrient);
Rect rect = boundingRect(contours[i]);
RotatedRect rotateRect = RotatedRect((Point2f)rect.tl(), Point2f(rect.br().x, rect.tl().y), (Point2f)rect.br());
Point2f rect_points[4];
rotateRect.points(rect_points);
for (size_t j = 0; j < 4; j++)
rect_points[j] = GetPointAfterRotate((Point)rect_points[j], (Point)*pos, -dOrient);
for (size_t j = 0; j < 4; j++)
line(img, rect_points[j], rect_points[(j + 1) % 4], Scalar(255, 255, 0), 2);
circle(img, rotateRect.center, 2, Scalar(0, 255, 0), 2, 8, 0);
char cbuf[255];
double fshort = std::min(rect.width, rect.height);
double flong = std::max(rect.width, rect.height);
cout << "r.x = " << rotateRect.center.x << " r.y = " << rotateRect.center.y << " angle = " << angle << endl;
imshow("dst", img);
据此,我们可以根据实际情况设定距离扰动和角度扰动的大小进行判断。如有不足,还请指正。转载请标明出处。希望能对各位有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)