前言
Mat是opencv中的存儲圖像的容器,也是圖像像素矩陣
QImage是Qt中存儲圖片常用的類
Qt和opencv經(jīng)常配合在一起使用,但Qt的函數(shù)方法的參數(shù)是不接受Mat的,所以如果我們想要在Qt中操作opencv處理后的圖像,就必須將Mat轉(zhuǎn)換成QImage
Mat->QImage
Mat轉(zhuǎn)換成QImage,可直接使用QImage的構(gòu)造函數(shù)進(jìn)行轉(zhuǎn)換,但要注意的是,當(dāng)Mat類型是CV_8UC3時,因為opencv色彩空間是BGR,Qt默認(rèn)是RGB,所以需要轉(zhuǎn)換,可以使用opencv中的cvtColor函數(shù)或者Qt中的rgbSwapped來進(jìn)行轉(zhuǎn)換,注意在QImage的生存周期內(nèi),必須保證Mat中的數(shù)據(jù)不會被釋放,否則QImage就會失效
解決方法:調(diào)用QImage::bits函數(shù)復(fù)制一份Mat數(shù)據(jù),這樣Mat釋放,QImage也能正常使用
QImage MainWindow::MatToImage(Mat &m) //Mat轉(zhuǎn)QImage
{
//判斷m的類型,可能是CV_8UC1 CV_8UC2 CV_8UC3 CV_8UC4
switch(m.type())
{ //QIamge 構(gòu)造函數(shù), ((const uchar *data, 寬(列),高(行), 一行共多少個(字節(jié))通道,寬度*字節(jié)數(shù),宏參數(shù))
case CV_8UC1:
{
QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 1,QImage::Format_Grayscale8);
return img;
}
break;
case CV_8UC3: //一個像素點由三個字節(jié)組成
{
//cvtColor(m,m,COLOR_BGR2RGB); BGR轉(zhuǎn)RGB
QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 3,QImage::Format_RGB888);
return img.rgbSwapped(); //opencv是BGR Qt默認(rèn)是RGB 所以RGB順序轉(zhuǎn)換
}
break;
case CV_8UC4:
{
QImage img((uchar *)m.data,m.cols,m.rows,m.cols * 4,QImage::Format_RGBA8888);
return img;
}
break;
default:
{
QImage img; //如果遇到一個圖片均不屬于這三種,返回一個空的圖片
return img;
}
}
}
QImage->Mat
QImage轉(zhuǎn)換Mat,可直接使用Mat的構(gòu)造函數(shù)進(jìn)行轉(zhuǎn)換,通過QImage提供的format函數(shù)判斷圖片類型,分別case不同情況,注意,圖片類型遠(yuǎn)不止這些,這里只是列舉常見的灰度圖和彩色圖類型
Mat MainWindow::ImageToMat(QImage &image) //QImage轉(zhuǎn)Mat
{
Mat mat = Mat::zeros(image.height(), image.width(),image.format()); //初始化Mat
switch(image.format()) //判斷image的類型
{
case QImage::QImage::Format_Grayscale8: //灰度圖
mat = Mat(image.height(), image.width(),
CV_8UC1,(void*)image.constBits(),image.bytesPerLine());
break;
case QImage::Format_RGB888: //3通道彩色
mat = Mat(image.height(), image.width(),
CV_8UC3,(void*)image.constBits(),image.bytesPerLine());
break;
case QImage::Format_ARGB32: //4通道彩色
mat = Mat(image.height(), image.width(),
CV_8UC4,(void*)image.constBits(),image.bytesPerLine());
break;
default:
return mat;
}
return mat;
}
這篇文章對你有幫助的話就點個贊吧~文章來源:http://www.zghlxwxcb.cn/news/detail-584078.html
點贊收藏關(guān)注就是對我最大的支持~文章來源地址http://www.zghlxwxcb.cn/news/detail-584078.html
到了這里,關(guān)于Mat與QImage互相轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!