我必须将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工作正常。这些技术之间的区别是什么?我可以用什么方法在这些方法之间归档相同的结果?

最佳答案

你的代码对我有用。

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。

关于c++ - QImage到cv::Mat与imread相比转换了奇怪的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40805441/

10-15 01:21