【问题标题】:from cvMat to QImage从 cvMat 到 QImage
【发布时间】:2016-09-19 23:53:23
【问题描述】:

我想将图像从 cvMat 类型转换为 Qimage ,使用我的实际代码应用程序不起作用;我以另一种方式做到了(Qimage to Mat 工作正常) 请告诉我我的代码出了什么问题

这是我的 Qimage 到 Mat 的代码:

Mat qimage2mat(const QImage& qimage) {
    cv::Mat mat = cv::Mat(qimage.height(), qimage.width(), CV_8UC4, (uchar*)qimage.bits(), qimage.bytesPerLine());
    cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3 );
    int from_to[] = { 0,0,  1,1,  2,2 };
    cv::mixChannels( &mat, 1, &mat2, 1, from_to, 3 );
    return mat2;
}

这是我的 Mat 到 Qimage 的代码

QImage mat2qimage(const Mat& mat) {
    Mat rgb;
    cvtColor(mat, rgb, CV_BGR2RGB);
    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888);
}

提前谢谢你

【问题讨论】:

  • Mat rgb 超出范围并在函数末尾被删除。复制图像数据或从mat转换,寿命更长。
  • 你能发送解释我如何复制数据
  • 或者,便宜的解决方案,用new创建一个Mat * rgb

标签: c++ qt opencv qimage opencv-mat


【解决方案1】:

正如@SpamBot 提到的,当 Mat 超出范围时,数据被释放。尝试深度复制数据:

QImage mat2qimage(const Mat& mat) 
{
    Mat rgb;
    cvtColor(mat, rgb, CV_BGR2RGB);
    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888).copy();
}

【讨论】:

  • 它不起作用,我认为使用的格式有问题
  • 此应用程序已请求运行时以异常方式终止它
  • 奇怪...对我来说,这段代码似乎有效...你能找出 mat.type() 吗?你能找出它崩溃的代码行吗?您能否在程序中运行不同的 OpenCV 代码而不会崩溃?
  • 是的,我的应用程序可以在不调用 mat2qimage 的情况下正常工作
猜你喜欢
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多