qt中用opencv算法计算轮廓圆度
时间: 2023-12-31 16:06:16 浏览: 84
在Qt中使用OpenCV库算法计算轮廓圆度,可以按照以下步骤进行:
1. 引入OpenCV库头文件和命名空间:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
```
2. 读入图像并进行预处理,如灰度化、二值化等操作:
```c++
Mat img = imread("your_image_path", IMREAD_GRAYSCALE);
threshold(img, img, 128, 255, THRESH_BINARY);
```
3. 提取轮廓并计算轮廓面积和周长:
```c++
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
double area = contourArea(contours[0]);
double perimeter = arcLength(contours[0], true);
```
4. 根据面积和周长计算轮廓圆度:
```c++
double circularity = 4 * CV_PI * area / pow(perimeter, 2);
```
其中,CV_PI是OpenCV中定义的圆周率常量。
最后,可以将计算得到的圆度值输出或进行其他处理。
相关问题
qt中用opencv算法提取轮廓后,如何针对轮廓进行去除毛刺
在OpenCV中,可以使用形态学操作对轮廓进行去除毛刺。形态学操作是基于图像形状的一系列操作,可以对图像进行膨胀、腐蚀、开运算、闭运算等操作。
使用形态学操作去除轮廓毛刺的步骤如下:
1. 将轮廓创建为二值图像,其中轮廓内部的像素值为255,轮廓外部的像素值为0。
2. 对该二值图像进行闭运算,可以使用 OpenCV 中的 morphologyEx 函数实现。闭运算可以去除轮廓内部的小孔洞和毛刺。
```c++
Mat closed_img;
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
morphologyEx(binary_img, closed_img, MORPH_CLOSE, kernel);
```
3. 对闭运算后的图像进行开运算,可以使用 OpenCV 中的 morphologyEx 函数实现。开运算可以去除轮廓外部的毛刺。
```c++
Mat opened_img;
morphologyEx(closed_img, opened_img, MORPH_OPEN, kernel);
```
4. 最后,可以将去除毛刺后的图像与原始图像进行逐像素的与操作,得到去除毛刺后的轮廓图像。
```c++
Mat contour_img;
bitwise_and(original_img, opened_img, contour_img);
```
这样就可以针对轮廓进行去除毛刺的操作了。
qt中用opencv获取轮廓之后怎么填充轮廓
在Qt中,可以使用OpenCV的代码来获取轮廓,并且将其填充。以下是一个简单的示例,描述如何在Qt中使用OpenCV来填充轮廓:
首先,需要包含OpenCV和Qt的头文件:
```
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <QImage>
```
然后,使用OpenCV中的函数来获取轮廓:
```
cv::Mat cvImage;
cvImage = cv::imread("yourImage.png");
cv::Mat grayImage;
cv::cvtColor(cvImage, grayImage, CV_BGR2GRAY);
cv::Mat binaryImage;
cv::threshold(grayImage, binaryImage, 100, 255, cv::THRESH_BINARY);
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(binaryImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); // 获取轮廓
```
接下来,可以使用以下代码将轮廓填充:
```
QImage qim = QImage(cvImage.data, cvImage.cols, cvImage.rows, cvImage.step, QImage::Format_RGB888);
QPainter painter(&qim);
for(int i = 0; i< contours.size(); i++)
{
cv::drawContours(cvImage, contours, i, cv::Scalar(0, 255, 0), -1, 8, hierarchy); // 填充轮廓
}
painter.drawImage(0, 0, qim);
```
最后,将填充后的图像显示在Qt应用程序中:
```
QLabel* label = new QLabel();
QPixmap pixmap = QPixmap::fromImage(qim);
label->setPixmap(pixmap);
label->setFixedSize(pixmap.width(),pixmap.height());
label->show();
```
以上就是使用OpenCV和Qt填充轮廓的基本步骤。
阅读全文