QT中對Mat類的一些操作詳解_第1頁
QT中對Mat類的一些操作詳解_第2頁
QT中對Mat類的一些操作詳解_第3頁
QT中對Mat類的一些操作詳解_第4頁
QT中對Mat類的一些操作詳解_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第QT中對Mat類的一些操作詳解目錄一、類型轉(zhuǎn)換二、保存至數(shù)據(jù)庫

一、類型轉(zhuǎn)換

opencv在QT中的應用通常會涉及到這三者的轉(zhuǎn)換,即Mat、QImage、QPixmap。

下面分別給出了

Mat轉(zhuǎn)QImageQImage轉(zhuǎn)MatMat轉(zhuǎn)QPixmap

1??:Mat轉(zhuǎn)QImage

QImageMainWindow::MatToImage(constMatm)//Mat轉(zhuǎn)Image

switch(m.type())

caseCV_8UC1:

QImageimg((uchar*)m.data,m.cols,m.rows,m.cols*1,QImage::Format_Grayscale8);

returnimg;

break;

caseCV_8UC3:

QImageimg((uchar*)m.data,m.cols,m.rows,m.cols*3,QImage::Format_RGB888);

returnimg.rgbSwapped();//因為在QT中彩色圖象是RGB的順序,但是在OPENCV中是BGR的順序,所以要轉(zhuǎn)一下

break;

caseCV_8UC4:

QImageimg((uchar*)m.data,m.cols,m.rows,m.cols*4,QImage::Format_ARGB32);

returnimg;

break;

default://如果是默認的,那么將其返回為一個空對象

QImageimg;

returnimg;

2??:QImage轉(zhuǎn)Mat

MatMainWindow::ImageToMat(constQImageimg,boolinCloneImageData)//Image轉(zhuǎn)Mat

switch(img.format())

caseQImage::Format_Indexed8://單通道

Matmat(img.height(),img.width(),CV_8UC1,

const_castuchar*(img.bits()),static_castsize_t(img.bytesPerLine()));

return(inCloneImageDatamat.clone():mat);

//8-bit,3通道

caseQImage::Format_RGB32://這種寫法表示并列關(guān)系

caseQImage::Format_RGB888:

if(!inCloneImageData)

qWarning()"CVS::QImageToCvMat()-ConversionrequirescloningbecauseweuseatemporaryQImage";

QImageswapped=img;

if(img.format()==QImage::Format_RGB32)

swapped=swapped.convertToFormat(QImage::Format_RGB888);

swapped=swapped.rgbSwapped();//因為在QT中彩色圖象是RGB的順序,但是在OPENCV中是BGR的順序,所以要轉(zhuǎn)一下

returnMat(swapped.height(),swapped.width(),CV_8UC3,

const_castuchar*(swapped.bits()),static_castsize_t(swapped.bytesPerLine())).clone();

//8-bit,4channel

caseQImage::Format_ARGB32:

caseQImage::Format_ARGB32_Premultiplied:

Matmat(img.height(),img.width(),CV_8UC4,

const_castuchar*(img.bits()),static_castsize_t(img.bytesPerLine()));

return(inCloneImageDatamat.clone():mat);

//8-bit,1channel

default:

qWarning()"CVS::QImageToCvMat()-QImageformatnothandledinswitch:"img.format();

break;

returnMat();

3??:Mat轉(zhuǎn)QPixmap

QPixmapMainWindow::MatToPixmap(constMatm)

returnQPixmap::fromImage(MatToImage(m));//相當于先將Mat轉(zhuǎn)成Image,再轉(zhuǎn)成Pixmap

二、保存至數(shù)據(jù)庫

我這里是直接將Mat類型的數(shù)據(jù)以二進制數(shù)據(jù)流的方式保存到數(shù)據(jù)庫中,有些文章是將文件名及其所在的路徑保存到數(shù)據(jù)庫中,這個還是要好看項目需求,個人而言,我這個要更復雜一點。

演示效果如下:

1??:基礎界面

2??:磨皮處理

3??:數(shù)據(jù)庫中的數(shù)據(jù)

4??:核心代碼

注意:創(chuàng)建數(shù)據(jù)表的時候,字段的類型,一定要滿足數(shù)據(jù)的大小,比方說保存圖片一般使用blob相關(guān)的類型,其中blob最大為64k,mediumblob最大為16M。

思路,先捕獲ui控件(我用于顯示圖片的控件是QLabel)中的數(shù)據(jù),然后進行數(shù)據(jù)庫操作。具體步驟如下:

數(shù)據(jù)類型:ImageMat。

然后再將Mat類型保存到byte數(shù)組中,再上傳到數(shù)據(jù)庫。(此時有小伙伴可能就要問了,為什么不直接從Image類型轉(zhuǎn)byte數(shù)組呢?當然可以,不過我們饒了個彎子也是想讓大家學會如何將Mat類型轉(zhuǎn)成byte數(shù)組)

上傳數(shù)據(jù)庫,用戶名+圖片數(shù)據(jù)(這個看自身的需求)

準備數(shù)據(jù)庫查詢語句query,用法如下圖所示

驗證階段,取回圖片,然后顯示在右側(cè)的QLabel中,因為我代碼中取回的是用戶id為33的圖片數(shù)據(jù),所以顯示的是一個水瓶。

voidMainWindow::Upmysql()//將處理的圖片上傳至數(shù)據(jù)庫

QImagepix=ui-Process_image-pixmap()-toImage();

Matm=ImageToMat(pix);//QImage---Mat格式轉(zhuǎn)換

intheight=pix.height();//定義這兩者的目的是為了傳給Mat的構(gòu)造函數(shù)

intwidth=pix.width();

intiSize=m.total()*m.elemSize();//記錄Mat圖像的大小,以便于創(chuàng)建同等大小的字節(jié)數(shù)組

unsignedchar*bytes=newunsignedchar[iSize];//創(chuàng)建一個字節(jié)數(shù)組,用于保存二進制數(shù)據(jù)

memcpy(bytes,m.data,iSize*sizeof(unsignedchar));//將Mat類型的數(shù)據(jù)賦給byte數(shù)組

//qDebug()QByteArray((char*)bytes,100);//查看前100個字符

QByteArraysbuf=QByteArray::fromRawData((char*)bytes,iSize*sizeof(unsignedchar));//將unsignedchar轉(zhuǎn)為QByteArray類型

QVariantvar(sbuf);//將QByteArray類型轉(zhuǎn)成QVariant以便于插入到MYSql

QSqlQueryquery;//下面為數(shù)據(jù)庫查詢的一種方式,要特別注意格式的要求

//創(chuàng)建數(shù)據(jù)表的時候,一定要注意數(shù)據(jù)的大小,比方說圖片blob為64k,mediumblob為16m

query.prepare("INSERTINTOImage_All(id,img_data)"

"VALUES(:id,:img_data)");

query.bindValue(":id",77877);//我這里隨便設的

query.bindValue(":img_data",var);

if(query.exec())

qDebug()"圖片成功上傳至數(shù)據(jù)庫";

else{

qDebug()"圖片上傳數(shù)據(jù)庫失敗";

QStringsql1=QString("selectimg_datafromImage_Allwhereid='33'");//獲取數(shù)據(jù)庫中圖片數(shù)據(jù)

if(query.exec(sql1))//執(zhí)行sql語句是否成功

while(query.next())//指向下一條

//根據(jù)下標將返回結(jié)果進行分割

QByteArrayTEXT1=query.value(0).toByteArray();//將查詢結(jié)果以QByteArray形式返回

unsignedchar*data2;

data2=reinterpret_castunsignedchar*(TEXT1.data());//將QByteArray類型轉(zhuǎn)為unsignedchar

Matimage=Mat(height,width,CV_8UC3,data2)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論