// 영어로 죄송합니다.cv :: Mat to QImage 및 뒤로
제게 말해주십시오, 내가 뭘 잘못하고있는 걸까요? 나는 이것을 많이 읽었습니다. 그리고 몇 가지 코드를 작성하지만, 나는 끔찍한 결과가 있습니다. 내가 OpenCV의에서 알고있는 것처럼
는 CV_8UC3 이에 따라 BRG 및 RGB를 제외하고, QImage :: Format_RGB888과 동일합니다. 이 형식으로 이력서 :: 매트를 읽을 수
내가 할 수있는 :
cv::Mat mat1 = cv::imread("bugero.jpg",3);
을 따라서, QImage에 이력서 :: 매트를 변환 내가 할 수있는 :
QImage Mat2QImage(cv::Mat const& src)
{
cv::Mat temp(src.cols,src.rows,src.type());
cvtColor(src, temp,CV_BGR2RGB);
QImage dest= QImage((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
return dest;
}
내가 렸기 때문에 임시 매트를 만들어 QImage에 데이터 복사본이 있어야합니다.
그런 다음. 내가해야 할 그것을 다시 변환하려면
cv::Mat QImage2Mat(QImage const& src)
{
QImage temp = src.copy();
cv::Mat res(temp.height(),temp.width(),CV_8UC3,(uchar*)temp.bits(),temp.bytesPerLine());
cvtColor(res, res,CV_BGR2RGB);
return res;
}
내가 cvtColor (입술, 입술, CV_BGR2RGB)를 삽입 한; BGR 색상으로 cv Mat을 만드는 것. 이 함수의 내부에서 정확히 무엇이 들어 있는지 알지 못한다. cvtColor (res, res, CV_BGR2RGB); 그러나 나는 을 결정했다. cvtColor (res, res, CV_BGR2RGB); 장소가 R과 B로 바뀌므로, 내가 찾지 못했기 때문에이 색상의 장소를 뒤 바꿀 것입니다. CV_BGR2RGB.
그래서, 짧은 샘플 프로그램
#include <QApplication>
#include <QtGui>
#include <cv.h>
#include "opencv2/highgui/highgui.hpp"
QImage Mat2QImage(cv::Mat const& src)
{
cv::Mat temp(src.cols,src.rows,src.type()); // make the same cv::Mat
cvtColor(src, temp,CV_BGR2RGB); // cvtColor Makes a copt, that what i need
QImage dest= QImage((uchar*) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
return dest;
}
cv::Mat QImage2Mat(QImage const& src)
{
QImage temp = src.copy();
cv::Mat res(temp.height(),temp.width(),CV_8UC3,(uchar*)temp.bits(),temp.bytesPerLine());
cvtColor(res, res,CV_BGR2RGB); // make convert colort to BGR !
return res;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget W1;
QWidget W2;
QLabel imlab1(&W1);
QLabel imlab2(&W2);
W1.setWindowTitle("Convert cv::Mat to QImage First time");
W2.setWindowTitle("Convert cv::Mat to QImage Second time");
cv::Mat mat1 = cv::imread("bugero.jpg",3);
QImage qim1 = Mat2QImage(mat1);
cv::Mat mat2 = QImage2Mat(qim1);
QImage qim2 = Mat2QImage(mat2);
cv::Mat mat3 = QImage2Mat(qim2);
cv::imshow("First Mat",mat1);
imlab1.setPixmap(QPixmap::fromImage(qim1));
W1.setFixedSize(qim1.size());
cv::imshow("Convert QImage to cv::Mat firstly",mat2);
imlab2.setPixmap(QPixmap::fromImage(qim2));
W2.setFixedSize(qim2.size());
cv::imshow("Convert QImage to cv::Mat secondly",mat2);
W1.show();
W2.show();
return a.exec();
}
및 .PRO 파일
INCLUDEPATH += /usr/local/include/opencv /usr/local/include/opencv2
LIBS += -lopencv_core -lopencv_imgproc\
-lopencv_highgui
QT += gui
QT += core
SOURCES += \
QcvMat.cpp \
썼다 그리고 나는 나쁜 결과를 가지고있다!
어떤 것이 있습니까? 사람들, 나는 도움이 필요해!
일부 디버그 정보를 추가하여 cv :: Mat.step 및 QImage.bytesPerLine()을 얻었습니다.
[email protected] /media/Files/Programming/Cpp/tests/QImagecvMat $ ./QcvMat
cv step 942
QImage bytesPerLine 944
cv step 942
QImage bytesPerLine 944
무엇이 의미가 있으며 문제가있을 수 있나요?
'dest.detach()'를 실행하고'dest'를 리턴 할 수 없습니까? 또한,'detach()'는 [documentation] (http://qt-project.org/doc/qt-5/qimage.html)에 없습니다. 왜? 어느 쪽이든, [이 솔루션] (http://asmaloney.com/2013/11/code/converting-between-cvmat-and-qimage-or-qpixmap/)은 Qt의'rgbSwapped()'를 사용하여 작동하고 문서화되어 있습니다. – takfuruya
좋은 링크, 내가이 답변을 쓰고있을 때 아직이 페이지가 존재하지 않았다. :) 확실히 더 나은 해결책입니다 (더 보편적입니다). 나는'CV_8UC1' (메모리가 분리되지 않은) 케이스에 대해 하나의 에러를 봅니다. 그것은'cvMatToQPixmap'과 함께 사슬에서 사용 되었기 때문에 노출되지 않았습니다. 그리고 이것은 내용을 복사합니다. 이 '분리 (detach)'에 관해서는 그것이 문서화되어 있지 않다는 것을 눈치 채지 못했습니다. 그래서 나는 이것을 고칠 것이다. –
나는 너를 지금 안아 줄 수있어! 나를 위해 마술 같이 일했다, 멋지게 사람을 설명했다! – PRIME