[問題]QT和OpenCV的整合bug

看板C_and_CPP (C/C++)作者 (加油!!變強)時間16年前 (2010/01/28 14:56), 編輯推噓1(107)
留言8則, 2人參與, 最新討論串1/1
小弟最近試著用Qt Creator開發OpenCV和Qt整合的C++程式 遇到了一點問題 詳細如下 用MainWindow類別繼承QMainWindow開一個視窗 寫一個繼承QGraphicsScene的CvScene類別於QGraphicsView中建置 在CvScene中加入QGraphicsPixmapItem當OpenCV影像處理的顯示介面 從網路上找OpenCV影像格式IplImage轉Qt影像格式QPixmap的函式 將OpenCV處理過的影像顯示在CvScene上 現在是先用灰階轉換來測試 於是做一個QAction按鈕在QMainWindow的QToolBar中 按下按鈕時用Qt的signal/slot機制去呼叫 CvScene中用OpenCV轉灰階的slot函式 此時程式當掉了 出現~~.exe exited with code -1073741819 的錯誤訊息 程式片段如下 CvScene中轉灰階的slot函式 宣告 class CvScene:public QGraphicsScene { Q_OBJECT ~~~~~~~~ public slots: void cvCvt2Gray(); ~~~~~~~~ }; 實作 void CvScene::cvCvt2Gray() { IplImage *src=cvLoadImage("123.jpg",CV_LOAD_IMAGE_COLOR); IplImage *des=cvCreateImage(cvGetSize(cvImg),IPL_DEPTH_8U,1); cvCvtColor(src,des,CV_RGB2GRAY); qImgItem->setPixmap(qcvQPixmap(des)); //qImgItem是一個QGraphicsPixmapItem //qcvQPixmap是IplImage轉成QPixmap的函式 } MainWindow建構子建置的QAction按鈕和connect機制 toolBar=new QToolBar(); cvtColor=new QAction("Convert Gray",toolBar); toolBar->addAction(cvtColor); this->addToolBar(toolBar); connect(cvtColor,SIGNAL(triggered()),scene,SLOT(cvCvt2Gray())); //scene是一個CvScene 其中triggered()是QAction按下時會發出的signal 問題不會是在IplImage轉QPixmap的程式上 因為一開始顯示的影像就是從OpenCV開檔成功轉換顯示出來 這樣看起來似乎是connect機制和cvCvtColor衝突到 不過我在MainWindow中又加了個emit cvtColor->trigger(); 等於是"自動"呼叫QAction的slot trigger()讓它觸動signal triggered() 去connect呼叫轉灰階cvCvt2Gray() (這裡我也不知道為啥slot可以被emit) 卻是成功轉灰階程式沒有當掉 或是將cvCvt2Gray中內容加在建構子上執行也OK 所以總歸問題就是"手動去按按鈕呼叫OpenCV的影像處理函式會當機" 感覺這應該是蠻簡單的問題 因為試著整合兩者的人太多了 但在google上都沒看過這樣問題 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.56.71.90 ※ 編輯: goodwise 來自: 61.56.71.90 (01/28 14:58)

01/28 16:36, , 1F
要用IplImage->imagedata 轉給qt的object
01/28 16:36, 1F

01/28 16:41, , 2F
跟IplImage轉QPixmap無關,是按鈕只要呼叫到cvCvtColor就
01/28 16:41, 2F

01/28 16:41, , 3F
01/28 16:41, 3F

01/28 16:58, , 4F
改成 cvGetSize(src)
01/28 16:58, 4F

01/28 17:08, , 5F
cvCreateImage(...)改成cvCloneImage(src)還是一樣
01/28 17:08, 5F

01/28 17:09, , 6F
但是cvCvtColor()這行去掉就不會當,留著就當y
01/28 17:09, 6F

01/29 11:09, , 7F
找到問題了 弄到VC上去跑似乎OK 但VC我還不會qmake moc
01/29 11:09, 7F

01/29 11:09, , 8F
所以還沒辦法在上面寫connect signal/slot
01/29 11:09, 8F
文章代碼(AID): #1BOJK5-v (C_and_CPP)
文章代碼(AID): #1BOJK5-v (C_and_CPP)