opencv找出图片中的所有同心圆标识和方形黑白标识的中心坐标c++
时间: 2023-10-25 11:07:48 浏览: 136
要找出图片中的所有同心圆标识和方形黑白标识的中心坐标,可以使用OpenCV中的函数`findContours`来查找标识对象的轮廓,然后使用`moments`函数来计算轮廓的几何矩,最后使用这些几何矩计算出标识中心的坐标。
下面是一个简单的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取图像
Mat img = imread("image.jpg");
// 将图像转换为灰度图像
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// 二值化图像
Mat thresh;
threshold(gray, thresh, 127, 255, THRESH_BINARY);
// 查找轮廓
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(thresh, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 遍历每个轮廓
for (size_t i = 0; i < contours.size(); i++)
{
// 计算轮廓的几何矩
Moments moments = moments(contours[i]);
// 如果轮廓面积太小,则忽略该轮廓
if (moments.m00 < 100)
continue;
// 计算标识中心的坐标
int cx = moments.m10 / moments.m00;
int cy = moments.m01 / moments.m00;
// 判断标识类型
double area = contourArea(contours[i]);
double perimeter = arcLength(contours[i], true);
double circularity = 4 * M_PI * area / (perimeter * perimeter);
// 如果是同心圆标识
if (circularity > 0.9)
{
// 在图像上绘制标识中心和类型
circle(img, Point(cx, cy), 5, Scalar(0, 0, 255), -1);
putText(img, "Circle", Point(cx, cy + 20), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255), 1);
}
// 如果是方形黑白标识
else
{
// 在图像上绘制标识中心和类型
circle(img, Point(cx, cy), 5, Scalar(0, 255, 0), -1);
putText(img, "Square", Point(cx, cy + 20), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);
}
}
// 显示图像
imshow("image", img);
waitKey(0);
destroyAllWindows();
return 0;
}
```
在此示例代码中,我们首先找到所有轮廓,然后遍历每个轮廓。对于每个轮廓,我们计算它的几何矩,并根据轮廓的面积和周长计算它的圆度(circularity)。如果圆度大于0.9,则认为这个轮廓是同心圆标识,否则认为它是方形黑白标识。最后,我们在图像上绘制标识中心和类型。
阅读全文