cv::Mat to QImage and back

前端 未结 2 978
自闭症患者
自闭症患者 2020-11-27 18:27

//Sorry for my english.

Tell me please, what I am doing wrong? I have read a lot about this. And write some code, but I have a terrible result.

As I

相关标签:
2条回答
  • 2020-11-27 18:28

    Thanks a Lot! It is realy works! But. Why does memory whas spoiled? First. I have some memory load incv::Mat

    cv::Mat mat1 = cv::imread("bugero.jpg",3);
    
    mat1 - [=====================================]
    

    then I put a copy of this cvMat to other cv:Mat

    cv::Mat temp(src.cols,src.rows,src.type());
    cvtColor(src, temp,CV_BGR2RGB);
    
    mat1  -  [=========================================]
    
    temp  -  [=========================================]
    

    then make QImage from this data QImage dest= QImage((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);

    mat1  -   [============================================]
    
    temp  - > [============================================]
             /
    dest --/
    

    And then temp goes out of scope and delete it self? QImage does not take ownership of it so memory in temp1 and dest marked as free, and there compiler can put other data? Is I am right?

    0 讨论(0)
  • 2020-11-27 18:48

    Code looks fine with one exception.
    Memory management. cv::Mat doesn't work like QImage in this mater. Remember that QImage is using copy on write mechanism and shares memory for each copy. cv::Mat also shares memory but it doesn't do copy on write (I'm also new with open cv (2 weeks) so I can't explain yet exactly how it works but I've stumbled on some crushes because of that)!
    Another thing is that when you are creating QImage from memory image is using this memory and doesn't take ownership of it.
    Final outcome is that on Linux and Qt5 your code is crashes because of problems with memory management. On your screen shot you can see at the top of second window that something strange is going on and you see some memory trash.

    So I've corrected your conversion functions it works perfectly:

    QImage Mat2QImage(cv::Mat const& src)
    {
         cv::Mat temp; // make the same cv::Mat
         cvtColor(src, temp,CV_BGR2RGB); // cvtColor Makes a copt, that what i need
         QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
         dest.bits(); // enforce deep copy, see documentation 
         // of QImage::QImage ( const uchar * data, int width, int height, Format format )
         return dest;
    }
    
    cv::Mat QImage2Mat(QImage const& src)
    {
         cv::Mat tmp(src.height(),src.width(),CV_8UC3,(uchar*)src.bits(),src.bytesPerLine());
         cv::Mat result; // deep copy just in case (my lack of knowledge with open cv)
         cvtColor(tmp, result,CV_BGR2RGB);
         return result;
    }
    

    So we both have to do a reading about memory management in open-CV :).

    OFFTOPIC:
    Best way to include openCV in qt projects on Linux is to add to pro file something like:

    # add open CV
    unix {
        CONFIG += link_pkgconfig
        PKGCONFIG += opencv
    }
    

    You will be free of path problems when moving code to another machine.

    0 讨论(0)
提交回复
热议问题