如何寻找图像中黄色区域的角点(inRange找到黄色区域后需进行形态学处理)C++
时间: 2024-03-04 18:50:22 浏览: 107
您可以使用OpenCV库中的函数来寻找图像中黄色区域的角点。具体步骤如下:
1. 使用inRange函数将图像中的黄色区域提取出来,得到一个二值图像。
2. 对二值图像进行形态学处理,可以使用函数morphologyEx,可以选择不同的操作,例如开运算、闭运算、膨胀、腐蚀等,以去除图像中的噪声和平滑图像。
3. 使用函数findContours找到图像中的轮廓。
4. 对每个轮廓使用函数approxPolyDP进行多边形拟合,得到轮廓的近似多边形。
5. 对多边形进行判断,如果多边形拟合结果是四边形,则说明该轮廓是矩形,可以使用函数cornerSubPix来进一步提取矩形的四个角点。
以下是一个实现的示例代码:
```c++
Mat srcImg = imread("image.jpg");
Mat hsvImg, binaryImg;
// 将图像转换到HSV空间
cvtColor(srcImg, hsvImg, COLOR_BGR2HSV);
// 设定黄色区域的HSV阈值
Scalar lower_yellow = Scalar(26, 43, 46);
Scalar upper_yellow = Scalar(34, 255, 255);
// 将图像中的黄色区域提取出来
inRange(hsvImg, lower_yellow, upper_yellow, binaryImg);
// 进行形态学处理
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(binaryImg, binaryImg, MORPH_OPEN, element);
// 寻找轮廓
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(binaryImg, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 对每个轮廓进行多边形拟合,并提取角点
for (int i = 0; i < contours.size(); i++) {
vector<Point> approxCurve;
approxPolyDP(contours[i], approxCurve, arcLength(contours[i], true) * 0.02, true);
if (approxCurve.size() == 4) {
// 绘制矩形轮廓
drawContours(srcImg, vector<vector<Point> >{approxCurve}, -1, Scalar(0, 0, 255), 2);
// 提取角点
vector<Point2f> corners;
for (int j = 0; j < approxCurve.size(); j++) {
corners.push_back(Point2f(approxCurve[j].x, approxCurve[j].y));
}
cornerSubPix(binaryImg, corners, Size(5, 5), Size(-1, -1), TermCriteria(TermCriteria::MAX_ITER | TermCriteria::EPS, 20, 0.01));
// 绘制角点
for (int j = 0; j < corners.size(); j++) {
circle(srcImg, corners[j], 5, Scalar(255, 0, 0), -1);
}
}
}
imshow("result", srcImg);
waitKey(0);
```
其中,image.jpg是待处理的图像文件名。
阅读全文