linux – Qimage to cv :: mat convertion奇怪的行为

linux – Qimage to cv :: mat convertion奇怪的行为,第1张

概述我正在尝试创建一个应用程序,我试图集成opencv和qt. 我成功地使用以下代码将cv :: Mat转换为QImage: void MainWindow::loadFile(const QString &fileName){ cv::Mat tmpImage = cv::imread(fileName.toAscii().data()); cv::Mat image; 我正在尝试创建一个应用程序,我试图集成opencv和qt.

我成功地使用以下代码将cv :: Mat转换为QImage:

voID MainWindow::loadfile(const QString &filename){    cv::Mat tmpImage = cv::imread(filename.toAscii().data());    cv::Mat image;    if(!tmpImage.data || tmpImage.empty())    {        QMessageBox::warning(this,tr("Error Occured"),tr("Problem loading file"),QMessageBox::Ok);        return;    }/* Mat to Qimage */    cv::cvtcolor(tmpImage,image,CV_BGR2RGB);    img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);    imgLabel->setpixmap(Qpixmap::fromImage(img));    imgLabel->resize(imgLabel->pixmap()->size());    saveAsAct->setEnabled(true);}

但是,当我尝试使用以下代码将QImage转换为cv :: Mat时:

bool MainWindow::saveAs(){    if(filename.isEmpty())    {        QMessageBox::warning(this,QMessageBox::Close);        return EXIT_FAILURE;    }else{        outputfilename = QfileDialog::getSavefilename(this,tr("Save As"),filename.toAscii().data(),tr("Image files (*.png *.jpg *.jpeg *.bmp)\n *.png\n *.jpg\n *.jpeg\n *.bmp"));    /* Qimage to Mat */    cv::Mat mat = cv::Mat(img.height(),img.wIDth(),CV_8UC4,(uchar*)img.bits(),img.bytesPerline());    cv::Mat mat2 = cv::Mat(mat.rows,mat.cols,CV_8UC3 );    int from_to[] = {0,1,2,2};    cv::mixChannels(&mat,&mat2,from_to,3);    cv::imwrite(outputfilename.toAscii().data(),mat);}saveAct->setEnabled(true);return EXIT_SUCCESS;}

我没有成功,结果是完全无序的图像.在我搜索的网中,我看到人们正在使用这种方式而没有提到任何具体问题.有人有任何想法,关于可能导致问题的原因是什么?提前致谢.

Theoodore

附:我在使用gnome-3.4的Arch linux系统下使用opencv 2.4和Qt 4.8

解决方法 只需找出将QImage复制(不参考)到cv :: Mat的“正确”解决方案

Martin Beckett的答案几乎是正确的

for (int i=0;i<image.height();i++) {    memcpy(mat.ptr(i),image.scanline(i),image.bytesperline());}

我没有看到完整的代码,但我想你可能想要这样使用它

cv::Mat mat(image.height(),image.wIDth(),CV_8UC3);for (int i=0;i<image.height();i++) {        memcpy(mat.ptr(i),image.bytesperline());    }

但是这段代码存在问题,
由cv :: Mat分配的内存可能与QImage没有相同的“bytesperline”

我找到的解决方案是首先引用QImage,然后克隆它

return cv::Mat(img.height(),format,img.bits(),img.bytesPerline()).clone();

Martin Beckett建议的解决方案可以在大多数情况下产生正确的结果
有时,我没注意到有一个BUG,直到我点击它.

无论如何,我希望这是一个“正确”的解决方案.如果您发现任何错误,请告知每个人都知道,所以我们可以改变以改进代码.

总结

以上是内存溢出为你收集整理的linux – Qimage to cv :: mat convertion奇怪的行为全部内容,希望文章能够帮你解决linux – Qimage to cv :: mat convertion奇怪的行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1017515.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存