用opencv库基于c++写一个识别识别硬币尺寸的代码
时间: 2024-06-12 13:06:57 浏览: 102
以下是一个基于OpenCV库,用C语言编写的识别硬币尺寸的代码:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 读取图像文件
Mat image = imread("coins.jpg", IMREAD_COLOR);
// 转换为灰度图像
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 对图像进行高斯模糊,以平滑图像
GaussianBlur(gray, gray, Size(9, 9), 2, 2);
// 进行Canny边缘检测
Mat edges;
Canny(gray, edges, 50, 150);
// 查找图像中的轮廓
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(edges, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 遍历所有轮廓,找到符合硬币形状的轮廓
for (size_t i = 0; i < contours.size(); i++)
{
double area = contourArea(contours[i]);
// 如果面积太小,跳过
if (area < 100)
continue;
// 计算轮廓周长
double perimeter = arcLength(contours[i], true);
// 计算圆形度
double circularity = 4 * M_PI * area / (perimeter * perimeter);
// 如果圆形度在0.6到1.0之间,认为是硬币
if (circularity >= 0.6 && circularity <= 1.0)
{
// 在原图像中绘制轮廓
drawContours(image, contours, i, Scalar(255, 0, 0), 2);
// 计算硬币直径
double diameter = sqrt(area / M_PI) * 2;
cout << "硬币直径为:" << diameter << "像素" << endl;
}
}
// 显示图像
imshow("image", image);
waitKey(0);
return 0;
}
```
该程序的大致思路如下:
1. 读取图像文件,并将其转换为灰度图像。
2. 对灰度图像进行高斯模糊,以平滑图像。
3. 进行Canny边缘检测,提取图像中的边缘。
4. 查找图像中的轮廓,并遍历所有轮廓。
5. 对每个轮廓,计算其面积、周长和圆形度。
6. 如果圆形度在0.6到1.0之间,认为是硬币,计算其直径并在原图像中绘制轮廓。
7. 显示图像和硬币直径。
需要注意的是,该程序对硬币的形状要求比较严格,只有圆形度在0.6到1.0之间的轮廓才会被识别为硬币。如果硬币的形状有一定变形,可能会导致识别失败。如果需要提高程序的鲁棒性,可以考虑使用其他形状特征,如凸包、最小外接圆等。
阅读全文