c++ - 与 imread 相比,QImage 到 cv::Mat 转换奇怪的行为

标签 c++ linux qt opencv

如果我使用 similar topics 中描述的技术,我必须将 QImage 转换为 cv::Mat ,我收到不同数量的轮廓 (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++ - 与 imread 相比,QImage 到 cv::Mat 转换奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40805441/

相关文章:

c++ - "std::endl"与 "\n"

c++ - 定义的 `inline` 找不到用于特化的模板方法

mysql - 将 sql 文件复制到 Raspberry Pi 上的不同数据库中

c++ - cuda可以用什么来画图

c++ - 重载 * 以充当解引用

c - 使用 g_rename 函数编译 GTK+ 应用程序时出错

linux - 挂载文件系统后,如何使用它?

image - Qml图片和内存释放

c++ - 如何将网络摄像机的图像显示为实时视频,同时在 Qt 中进行一些音频处理?

c++ - 如何使用 QGraphicsItem 绘制图像?