版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年安徽省合肥市肥西縣上派鎮(zhèn)樂平路小學臨聘教師招聘備考題庫含答案詳解(綜合卷)
- 2026年安徽省合肥市濱湖啟明星幼兒園教師、保育員招聘備考題庫附參考答案詳解(a卷)
- 2026廣東廣州花都區(qū)鄺維煜紀念中學臨聘教師招聘2人備考題庫附答案詳解(滿分必刷)
- 2026新疆城實工程管理有限公司招聘備考題庫及答案詳解(新)
- 2026屆山東省新高二數(shù)學第一學期期末教學質(zhì)量檢測試題含解析
- 紙面石膏板制備工班組建設評優(yōu)考核試卷含答案
- 鐵合金電爐冶煉工安全規(guī)程水平考核試卷含答案
- 煉焦配煤工創(chuàng)新實踐評優(yōu)考核試卷含答案
- 膠合板工崗前基礎管理考核試卷含答案
- 硫酸生產(chǎn)工崗前保密意識考核試卷含答案
- 服務外包人員保密管理制度(3篇)
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責任公司社會成熟人才招聘備考題庫及答案詳解(奪冠系列)
- 成都高新區(qū)桂溪街道公辦幼兒園招聘編外人員考試備考題庫及答案解析
- 2025年醫(yī)院病歷管理操作規(guī)范
- 2026云南保山電力股份有限公司校園招聘50人筆試備考題庫及答案解析
- GB 4053.2-2025固定式金屬梯及平臺安全要求第2部分:斜梯
- 2026屆上海市長寧區(qū)市級名校高一上數(shù)學期末學業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 2026年煙草公司筆試綜合試題及考點實操指引含答案
- 九年級寒假期末總結(jié)課件
- 壓鑄機作業(yè)人員安全培訓課件
- 新產(chǎn)品研發(fā)質(zhì)量管控流程詳解
評論
0/150
提交評論