qt中opencv的fillPoly函数怎么用
时间: 2023-05-24 09:04:08 浏览: 161
A:在Qt中使用OpenCV的fillPoly函数需要先将Qt中的QImage转换为OpenCV中的Mat类型,然后再使用fillPoly函数进行多边形的填充。
示例代码如下:
```
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
QImage cvMat2QImage(const cv::Mat& mat) {
// 从opencv的Mat类型转换为Qt的QImage类型
QImage image(mat.cols, mat.rows, QImage::Format_RGB888);
uchar *data = image.bits();
for (int i = 0; i < mat.rows; ++i) {
const uchar *p = mat.ptr<uchar>(i);
for (int j = 0; j < mat.cols; ++j) {
*data++ = p[j * 3];
*data++ = p[j * 3 + 1];
*data++ = p[j * 3 + 2];
}
}
return image;
}
cv::Mat qImage2CvMat(const QImage& image) {
// 从Qt的QImage类型转换为OpenCV的Mat类型
cv::Mat mat(image.height(), image.width(), CV_8UC4, const_cast<uchar*>(image.bits()), image.bytesPerLine());
cv::Mat dst;
cv::cvtColor(mat, dst, cv::COLOR_RGBA2BGR); // QImage默认是ARGB格式,需要转换为BGR格式
return dst;
}
void fillPolyTest() {
QImage img("test.jpg");
cv::Mat src = qImage2CvMat(img);
std::vector<cv::Point> pts;
pts.push_back(cv::Point(100, 100));
pts.push_back(cv::Point(200, 100));
pts.push_back(cv::Point(150, 200));
cv::fillPoly(src, std::vector<std::vector<cv::Point> >(1, pts), cv::Scalar(255, 0, 0));
QImage dst = cvMat2QImage(src);
// 显示结果
QLabel* label = new QLabel();
label->setPixmap(QPixmap::fromImage(dst));
label->show();
}
```
上面的示例代码演示了如何将一个图像中指定的三个点组成的多边形进行填充(填充颜色为蓝色)。需要注意的是,fillPoly函数中的第二个参数是一个std::vector类型,每个元素表示一个多边形,可以指定多个多边形进行填充。
阅读全文