【问题标题】:QImage to cv::Mat convert strange behavior in comparison with imread与 imread 相比,QImage 到 cv::Mat 转换奇怪的行为
【发布时间】:2017-04-09 21:09:17
【问题描述】:

我必须将 QImage 转换为 cv::Mat,如果我使用 similar topics 中描述的技术,我会收到不同数量的轮廓 (7--8) 和奇怪的结果矩阵,但如果我这样做了

QImage im;
im.save ("tmp.bmp");
cv::Mat rImage;
rImage = cv::imread ("tmp.bmp", CV_LOAD_IMAGE_GRAYSCALE);

函数 findContours 可以正常工作。这些技术之间有什么区别,我可以通过哪种方式在这些方法之间归档相同的结果?

【问题讨论】:

  • 这可能取决于 QImage 格式。你的是什么?
  • RGB32格式的源图像。
  • 你能说明你实际使用的是哪个代码,你得到了什么奇怪的结果吗?
  • cv::Mat qimage_to_mat_cpy(const QImage &img, int format) { uchar* b = const_cast (img.bits ()); int c = img.bytesPerLine(); cv::Mat mat = cv::Mat(img.height(), img.width(), 格式, b, c).clone();返回垫; }
  • 请尝试使用this 代码。 QImageToCvMat 函数...应该适用于您的情况(通常有一些事情需要更正/更新)。

标签: c++ linux qt opencv


【解决方案1】:

您的代码对我有用。

int main(int argc, char *argv[]){
    QImage img(QString("lena.bmp"));
    QImage img2 = img.convertToFormat(QImage::Format_RGB32);
    cv::Mat imageMat = qimage_to_cvmat_copy(img2, CV_8UC4);
    cv::namedWindow("lena");
    cv::imshow("lena", imageMat);
    cv::waitKey(0);
}
cv::Mat qimage_to_cvmat_copy(const QImage &img, int format)
{
    uchar* b = const_cast<uchar*> (img.bits ());
    int c = img.bytesPerLine();
    return cv::Mat(img.height(), img.width(), format, b, c).clone();
}

如果您的 QImage 格式为 Format_RGB32,请确保您的 Mat 格式为 CV_8UC4。您不必执行 cvtColor 或 mixChannels。

【讨论】:

  • 好的,我做到了,但是 findContours 函数给出异常 OpenCV Error: Unsupported format or combination of formats ([Start]FindContours support only 8uC1 and 32sC1 images) in cvStartFindContours,
  • findContours 仅适用于 8 位单通道图像或 32SC1 图像。见link。您需要先将 4 通道 mat 图像转换为单通道图像。这通常可以通过 cvtColor 使用代码 CV_RGBA2GRAY 来完成
  • 抱歉,还有一个问题是 CV_RGBA2GRAY 还是 CV_RGB2GRAY ?我只在 2.3 和 2.4 版本的文档中找到 CV_RGB2GRAY
  • 在 opencv 3.1 中是 cv::COLOR_RGBA2GRAY 和 cv::COLOR_RGB2GRAY。此外,您的输入垫必须是二进制图像才能使 findContours 工作。这取决于您的项目如何实现这一目标。通常可以通过将 RGBA 图像转换为灰度图像,然后使用 cv::threshold() 对灰度图像进行阈值处理来完成。
【解决方案2】:

全部!

如上所述,我使用了将 QImage 转换为 cv::Mat 的方法,如 here 所述。我的源代码变成了这个样子

QImage srcIm (argv[1]);
QImage img2 = srcIm.convertToFormat(QImage::Format_ARGB32);
Mat src_gray = QImageToCvMat (img2);
cvtColor (src_gray, src_gray1, CV_RGB2GRAY);

Mat bwimg = src_gray1.clone();// > 127;
vector<vector<Point> > contours;

findContours( bwimg, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE );    

一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多