opencv只对图像中矩形区域做blob分析C++例程
时间: 2023-11-12 19:09:39 浏览: 112
以下是一个使用OpenCV的C++例程,用于在图像中检测矩形区域并进行blob分析:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// 读取图像文件
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
// 二值化图像
Mat binary_img;
threshold(img, binary_img, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
// 查找轮廓
vector<vector<Point>> contours;
findContours(binary_img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 筛选矩形轮廓
vector<Rect> rects;
for (size_t i = 0; i < contours.size(); i++)
{
Rect rect = boundingRect(contours[i]);
if (rect.width > 10 && rect.height > 10 && rect.width < img.cols && rect.height < img.rows)
{
rects.push_back(rect);
}
}
// 显示矩形
for (size_t i = 0; i < rects.size(); i++)
{
rectangle(img, rects[i], Scalar(255, 0, 0), 2);
}
// 显示图像
imshow("result", img);
waitKey();
// 对每个矩形进行blob分析
for (size_t i = 0; i < rects.size(); i++)
{
// 提取矩形区域
Mat roi = binary_img(rects[i]);
// 构建blob分析器
SimpleBlobDetector::Params params;
params.minDistBetweenBlobs = 10; // blob之间的最小距离
params.filterByArea = true; // 根据面积筛选blob
params.minArea = 50; // blob的最小面积
params.maxArea = 10000; // blob的最大面积
params.filterByCircularity = true; // 根据圆形度筛选blob
params.minCircularity = 0.8; // blob的最小圆形度
params.maxCircularity = 1.0; // blob的最大圆形度
SimpleBlobDetector blob_detector(params);
// 检测blob
vector<KeyPoint> keypoints;
blob_detector.detect(roi, keypoints);
// 显示结果
Mat result;
drawKeypoints(roi, keypoints, result, Scalar(0, 0, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imshow("result", result);
waitKey();
}
return 0;
}
```
此示例使用OpenCV的`findContours`函数查找图像中的轮廓,然后使用矩形边界框筛选出矩形轮廓。然后,它使用`SimpleBlobDetector`类对每个矩形进行blob分析,并在每个矩形上绘制检测到的blob。
阅读全文