對於C++的開發者來說,要開發UI的是非常麻煩的,以往都使用MFC來實現UI的部分,自從認識了QT之後,一切都變得不再麻煩,QT提供了Widget和QML兩種方式實做UI。但對於OpenCV的開發者來說必須先將OpenCV的影像格式轉換到QT的影像格式顯示,或者反過來都是。以下會介紹cv::Mat
與QImage
及IplImage
與QImage
的轉換。
cv::Mat
轉換到QImage
//sharing the buffer 共享記憶體
QImage ConvertQtOpenCV::CvMat2QImage( cv::Mat &image )
{
QImage qtImg;
if( !image.empty() && image.depth() == CV_8U ){
if(image.channels() == 1){
qtImg = QImage( (const unsigned char *)(image.data),
image.cols,
image.rows,
QImage::Format_Indexed8 );
}
else{
cvtColor( image, image, CV_BGR2RGB );
qtImg = QImage( (const unsigned char *)(image.data),
image.cols,
image.rows,
QImage::Format_RGB888 );
}
}
return qtImg;
}
IplImage
轉換到QImage
//sharing the buffer 共享記憶體
QImage ConvertQtOpenCV::IplImage2QImage( IplImage *image )
{
QImage qtImg;
if (image && image->depth == IPL_DEPTH_8U && cvGetSize(image).width > 0 )
{
if(image->nChannels == 1){
qtImg = QImage( (const unsigned char *)(image->imageData),
image->width,
image->height,
QImage::Format_Indexed8 );
}
else{
cvCvtColor( image, image, CV_BGR2RGB );
qtImg = QImage( (const unsigned char *)(image->imageData),
image->width,
image->height,
QImage::Format_RGB888 );
}
}
return qtImg;
}
QImage
轉換到cv::Mat
//sharing the buffer 共享記憶體
cv::Mat ConvertQtOpenCV::QImage2CvMat(QImage &image)
{
cv::Mat cvImage;
switch (image.format()){
case QImage::Format_RGB888:{
cvImage = cv::Mat(image.height(),
image.width(),
CV_8UC3,
image.bits(),
image.bytesPerLine());
cv::cvtColor(cvImage, cvImage, CV_RGB2BGR);
return cvImage;
}
case QImage::Format_Indexed8:{
cvImage = cv::Mat(image.height(),
image.width(),
CV_8U,
image.bits(),
image.bytesPerLine());
return cvImage;
}
default:
break;
}
return cvImage;
}
QImage
轉換到IplImage
//sharing the buffer 共享記憶體
IplImage *ConvertQtOpenCV::QImage2IplImage(QImage &image)
{
IplImage *cvImage = NULL;
switch (image.format()){
case QImage::Format_RGB888:{
cvImage = cvCreateImageHeader( cvSize(image.width(),
image.height()), 8, 3 );
cvSetData( cvImage, image.bits(), image.bytesPerLine() );
cvCvtColor( cvImage, cvImage, CV_RGB2BGR );
return cvImage;
}
case QImage::Format_Indexed8:{
cvImage = cvCreateImageHeader( cvSize(image.width(),
image.height()), 8, 1 );
cvSetData( cvImage, image.bits(), image.bytesPerLine() );
return cvImage;
}
default:
break;
}
return cvImage;
}