这里主要介绍opencv经常用画的几种图形:
我们一般都会把图片转换为二值图 代码如下:
Mat img = imread("2.png"); //读入图片
imshow("原图", img);
Mat dst1;
//blur(img, dst1, Size(3, 3));
medianBlur(img, dst1, 9);//均值滤波
imshow("滤波图", dst1);
cvtColor(dst1, dst1,7);
threshold(dst1, dst1, 180, 255, 1);//二值化
imshow("二值图", dst1);
做完二值化后我们在检测图片的轮廓,通过轮廓来对他进行画图(当然方法不唯一这里也可以经过边缘检测来实现):
vector> contours;
vector hierarchy;
findContours(dst1,contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
Mat dst2;
dst2 = Mat::zeros(img.size(), img.type());
for (int i = 0; i < contours.size(); i++) {
if (contourArea(contours[i]) > 100) {
drawContours(dst2, contours, i, Scalar(0, 0, 255), 1, 8, hierarchy);
}
}
imshow("轮廓图", dst2);
轮廓图效果:
正方形:
vectorpoly_rects(contours.size());
for (int i = 0; i < contours.size(); i++) {
poly_rects[i] = boundingRect(contours[i]);
rectangle(img, poly_rects[i], Scalar(255, 0, 0), 1, 8);
}
imshow("正矩形", img);
绘制正方形效果图:
旋转矩形:
Point2f ptr[4];
vectorminRoats(contours.size());
for (int i = 0; i < contours.size(); i++) {
minRoats[i] = minAreaRect(convexs[i]);
}
for (int i = 0; i < contours.size(); i++) {
minRoats[i].points(ptr);
for (int r = 0; r < 4; r++) {
line(img, ptr[r], ptr[(r + 1) % 4], Scalar(255, 255, 0), 1, 8);
}
}
imshow("旋转矩形", img);
绘制旋转矩形效果图:
圆:
vectorccs(contours.size());
vectorradius(contours.size());
for (int i = 0; i < contours.size();i++) {
minEnclosingCircle(convexs[i], ccs[i], radius[i]);
circle(img, ccs[i], radius[i], Scalar(255, 255, 255));
}
imshow("绘制圆", img);
绘制圆效果图:
椭圆:
vectormyllipse(contours.size());
for (int i = 0; i < contours.size(); i++) {
myllipse[i] = fitEllipse(convexs[i]);
ellipse(img, myllipse[i], Scalar(255, 0, 255), 1, 8);
}
imshow("绘制椭圆", img);
绘制椭圆效果图:
计算轮廓的中心、面积、周长:
vectorcontours_momnet(contours.size());
vectorcss(contours.size());
for (int i = 0; i < contours.size(); i++) {
contours_momnet[i] = moments(convexs[i]);
css[i]= Point(static_cast(contours_momnet[i].m10 / contours_momnet[i].m00), \
static_cast(contours_momnet[i].m01 / contours_momnet[i].m00));
circle(img, css[i], 2, Scalar(0, 100, 200), 1, 8);
}
for (int i = 0; i < contours.size(); i++) {
//drawContours(img, contours, i, Scalar(0, 100, 100), 1, 8, hierarchy, 0);
//12 计算每个轮廓的面积
cout << "面积" << i << ": " << contourArea(contours[i]) << endl;
//13 计算每个轮廓的周长
cout << "周长" << i << ": " << arcLength(contours[i], true) << endl;
}
imshow("轮廓的中心点", img);
waitKey(0);
效果图(轮廓中心画的有点小了自己可以调节一下):