opencv 获取轮廓/blob最大内接旋转矩形 c++
时间: 2023-12-13 17:01:01 浏览: 259
OpenCV 是一个广泛应用于计算机视觉和图像处理的开源库,它能够帮助我们获取图像中的轮廓和 Blob 最大内接旋转矩形。在 OpenCV 中,我们首先使用 findContours 函数来获取图像中的轮廓信息,该函数能够帮助我们找到图像中的对象边缘并以列表的形式返回。
接着,我们可以使用 boundingRect 函数来获取轮廓的最大内接矩形,该矩形可以完全包围住轮廓,并且它的长宽和轮廓的方向是一致的。对于包含物体的图像,Blob 是指一块连通的区域,我们可以使用 findContours 函数获取图像中的 Blob 信息。
最后,我们可以使用 minAreaRect 函数来获取 Blob 的最大内接旋转矩形,这个旋转矩形是能够包裹住 Blob 并且旋转角度最小的矩形。该函数返回一个包含旋转矩形信息的结构体,其中包含了旋转矩形的中心点坐标、长宽和旋转角度信息。
通过这些函数,我们能够轻松地在 OpenCV 中获取图像中的轮廓和 Blob 的最大内接旋转矩形信息,从而帮助我们在计算机视觉和图像处理领域进行更加精准和有效的操作。
相关问题
opencv blob分析C++
### 回答1:
在OpenCV中,Blob是指连接在一起的一组像素,其周围被边缘包围。Blob分析是指在图像中查找和分析这些Blob的过程。
Blob分析可以用于许多应用程序,例如物体跟踪、运动检测、人脸检测等。在OpenCV中,可以使用cv::SimpleBlobDetector类来进行Blob分析。
以下是使用cv::SimpleBlobDetector进行Blob分析的示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat image = imread("image.png", IMREAD_GRAYSCALE);
SimpleBlobDetector::Params params;
// Set up the blob detector parameters
params.minThreshold = 10;
params.maxThreshold = 200;
params.filterByArea = true;
params.minArea = 1500;
params.filterByCircularity = true;
params.minCircularity = 0.8;
params.filterByConvexity = true;
params.minConvexity = 0.87;
params.filterByInertia = true;
params.minInertiaRatio = 0.01;
// Create a blob detector with the specified parameters
Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);
// Detect blobs in the image
std::vector<KeyPoint> keypoints;
detector->detect(image, keypoints);
// Draw the detected blobs on the image
Mat image_with_keypoints;
drawKeypoints(image, keypoints, image_with_keypoints, Scalar(0, 0, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
// Display the image with the detected blobs
imshow("Blobs", image_with_keypoints);
waitKey(0);
return 0;
}
```
在这个示例中,我们使用cv::SimpleBlobDetector类来检测图像中的Blob,并使用cv::drawKeypoints函数在图像上绘制检测到的Blob。我们可以通过设置cv::SimpleBlobDetector::Params对象的不同参数来调整Blob检测的灵敏度和特征。
最后,我们使用cv::imshow函数将包含检测到的Blob的图像显示在屏幕上,并使用cv::waitKey函数等待用户按下键盘上的任意键来退出程序。
### 回答2:
OpenCV是一个开源的计算机视觉库,可以用于处理图像和视频。blob分析是一种常用的图像处理技术,用于检测和分析二值化图像中的连通区域。
在OpenCV中,可以使用函数`cv::connectedComponents`来进行blob分析。该函数将输入的二值化图像作为参数,并返回一个表示连通区域的标签图像和一个表示每个连通区域属性的结构体数组。
为了使用`cv::connectedComponents`函数,首先需要对输入图像进行二值化处理。可以使用阈值化操作,将图像中的像素值转化为0或255,使得目标区域为白色,背景为黑色。
接下来,将二值化后的图像作为参数传递给`cv::connectedComponents`函数,可以得到标签图像和属性数组。标签图像中的像素值表示这个像素属于哪个连通区域,背景像素值为0。属性数组中存储了每个连通区域的位置、大小和其他属性。
通过遍历标签图像和属性数组,可以获取每个连通区域的位置和大小等信息,进而进行各种对连通区域的分析和处理。例如,可以计算连通区域的面积、质心、矩形边界框等。
总结而言,OpenCV可以通过调用`cv::connectedComponents`函数来进行blob分析,从而得到二值化图像中的连通区域信息。这个功能在很多图像处理和计算机视觉应用中非常有用,例如目标检测、形状分析和运动跟踪等。
### 回答3:
OpenCV是一个用于计算机视觉和机器学习的开源库,可以编写C++、Python和Java等多种语言的代码。Blob分析是指在图像处理中对连通域(对象)进行分析和处理的过程。下面是一个用C语言来进行OpenCV Blob分析的示例代码:
```c
#include <opencv2/opencv.hpp>
#include <opencv2/core/utils/logger.hpp>
using namespace cv;
int main()
{
// 加载图像
Mat src = imread("image.jpg");
if (src.empty())
{
return -1;
}
// 将图像进行灰度化处理
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
// 对图像进行二值化处理
Mat binary;
threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 查找图像中的连通域(对象)
Mat labels;
Mat stats;
Mat centroids;
int numLabels = connectedComponentsWithStats(binary, labels, stats, centroids);
// 在控制台上输出对象的统计信息
for (int i = 1; i < numLabels; i++)
{
printf("label: %d, area: %d\n", i, stats.at<int>(i, CC_STAT_AREA));
}
// 在源图像上绘制连通域的轮廓
for (int i = 1; i < numLabels; i++)
{
drawContours(src, contours, i, Scalar(0, 0, 255), 2);
}
// 显示结果
imshow("binary", binary);
imshow("src", src);
waitKey(0);
return 0;
}
```
以上代码首先加载一张图像,然后将图像转换为灰度图,并进行二值化处理。接下来使用OpenCV的`connectedComponentsWithStats()`函数来查找图像中的对象,并获取对象的统计信息。最后,用`drawContours()`函数在原图像上绘制出每个对象的轮廓,并通过窗口显示结果。
这是一个基本的OpenCV Blob分析示例,你可以根据自己的需求进行适当的调整和扩展。
opencv只对图像中矩形区域做blob分析C++例程
以下是一个使用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。
阅读全文