opencv如何使用形状来对轮廓进行识别 c++
时间: 2024-04-09 13:32:56 浏览: 155
在++中,使用OpenCV库对轮廓进行形状别的步骤与Python似。以下是一个形状特征进行轮廓识别的例代码:
```cpp
#include <opencv2/.hpp>
int main() {
// 读取像并转为灰度
cv:: image = cv::imread("image.png");
cv::Mat gray;
cv::c(image, gray, cv::COLOR_BGR2GRAY);
// 二值化处理
cv::Mat threshold;
cv::threshold(gray, threshold, 127, 255, cv::THRESH_BINARY);
// 轮廓检测
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(threshold, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 遍历轮廓
for (size_t i = 0; i < contours.size(); i++) {
// 计算轮廓的面积
double area = cv::contourArea(contours[i]);
// 计算轮廓的周长
double perimeter = cv::arcLength(contours[i], true);
// 计算轮廓的凸包
std::vector<cv::Point> hull;
cv::convexHull(contours[i], hull);
// 计算轮廓的矩形边界框
cv::Rect boundingRect = cv::boundingRect(contours[i]);
// 计算轮廓的最小外接圆
cv::Point2f center;
float radius;
cv::minEnclosingCircle(contours[i], center, radius);
// 根据形状特征进行轮廓识别
if (area > 100 && perimeter > 50) {
// 在图像上绘制识别结果
cv::drawContours(image, contours, i, cv::Scalar(0, 255, 0), 2);
cv::rectangle(image, boundingRect, cv::Scalar(0, 0, 255), 2);
cv::circle(image, center, static_cast<int>(radius), cv::Scalar(255, 0, 0), 2);
}
}
// 显示结果图像
cv::imshow("Result", image);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
```
在这个示例代码中,我们使用`cv::imread()`函数读取图像,然后将其转换为灰度图像。接下来,使用`cv::threshold()`函数进行二值化处理。然后,使用`cv::findContours()`函数进行轮廓检测。我们遍历每个轮廓,并计算其面积、周长、凸包、矩形边界框和最小外接圆等形状特征。根据这些特征,我们可以根据需求进行轮廓的识别和筛选。在示例中,我们设置了一些简单的条件,如面积大于100、周长大于50等来识别轮廓。最后,我们在图像上绘制识别结果,并显示图像。
根据具体需求,你可以根据不同的形状特征和条件来实现轮廓的识别和筛选。
阅读全文