因為做項目要用這,也是白手起家。今天抽空把心得寫下,希望大家多頂哈!最初使用v4l2,但發現工作量太大了,而且自己寫的代碼不如opencv這么專業!
參照http://blog.csdn.net/hsl17/article/details/6925876,及http://www.linuxidc.com/Linux/2011-11/47347.htm等幾篇文章,最終將其調試成功。
?第一篇文章http://blog.csdn.net/hsl17/article/details/6925876已經說的很詳細了,但有個地方沒有說清。我將其補全:
MyWidget即是顯示視頻的widget,其頭文件如下:


對應的構造函數為:
1. ????capture?=?cvCaptureFromCAM(0);??
1. ????cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,320);??
1. ????cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,240);??
1. ????if(capture)??
1. ????{??
1. ????????QMessageBox::information(this,"Information","successful!");??
1. ????????if?(capture)??
1. ????????{??
1. ????????????frame?=?cvQueryFrame(capture);??
1. ????????????if?(frame)??
1. ????????????????this->resize(frame->width,frame->height);??
1. ????????????qImg?=?new?QImage(QSize(frame->width,frame->height),QImage::Format_RGB888);??
1. ????????????iplImg?=?cvCreateImageHeader(cvSize(frame->width,frame->height),8,3);??
1. ????????????iplImg->imageData?=?(char*)qImg->bits();??
1. ????????????timer?=?new?QTimer(this);??
1. ????????????timer->setInterval(30);??
1. ????????????connect(timer,SIGNAL(timeout()),this,SLOT(nextFrame()));??
1. ????????????timer->start();??
1. ????????????writer?=?cvCreateVideoWriter("out.avi",CV_FOURCC('D',?'I',?'V',?'X'),10,??
1. ?????????????????????????????????????????cvSize(frame->width,frame->height),1);??
1. ????????????isCamera?=?true;??
1. ????????}??
1. ????}??
1. ????else??
1. ????{??
1. ????????QMessageBox::information(this,"Information","Sorry,fail!");??
1. ????????isCamera?=?false;??
1. ????}??
1. 這里面有個問題,第一,程序無法運行,經檢查是
1. cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,320);??
1. ????cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,240); ?
1.
1. 這兩句話的問題。查了一圈資料,貌似不支持。將其屏蔽!注釋掉,程序就能運行了!
1. 第二,變量isCamera應該申明成為全局變量。按照原博客里的申明方法根本不可運行。將其申明為:static bool ?isCamera = false;這句話放在頭文件的外面!!!
1. 其他部分參照下面程序即可!
1. void?MyWidget::paintEvent(QPaintEvent?*e)??
1. {??
1. ????QPainter?painter(this);??
1. ????if(isCamera?==?true)??
1. ????{??
1. ????????painter.drawImage(QPoint(0,0),*qImg);??
1. ????}??
1. ????else??
1. ????{??
1. ??????????
1. ????}??
1. }??
1. void?MyWidget::nextFrame()??
1. {??
1. ????frame?=?cvQueryFrame(capture);??
1. ??
1. ????if?(frame)??
1. ????{??
1. ????????if?(frame->origin?==?IPL_ORIGIN_TL)??
1. ????????{??
1. ????????????cvCopy(frame,iplImg,0);??
1. ????????}??
1. ????????else??
1. ????????{??
1. ????????????cvFlip(frame,iplImg,0);??
1. ????????}??
1. ????????cvCvtColor(iplImg,iplImg,CV_BGR2RGB);??
1. ????????cvWriteFrame(writer,frame);??
1. ????????this->update();??
1. ????}??
1. } ?
1. 疑問:
1. 第一,有時候運行程序會卡住,直接出不來圖像。在MyWidget的析構函數中增加cvReleaseImage(&frame)好了很多。另外定時器的間隔時間調40ms、50ms會好點。我的電腦內存是4G,當內存占用1300多M時,運行程序卡的幾率很大。重啟后卡的幾率就變小了。 不知道為什么??
1. 第二,每次運行程序時,在顯示圖片之前會有警告。mmap:無效的參數
1. ?munmap:無效的參數
1. munmap;無效的參數 ?。。。。截圖:
1. 
我查了很多資料貌似是內存申請的問題。我在其他網站下載了另外一個讀取攝像頭視頻的程序,也可以運行。程序構建和上述有點不同,但也是會出現這些警告。這些警告過后就能照常運行了。 我猜測這是第一幀圖片沒有正確申請內存的原因。解決辦法正在思考zhong. 也希望高人過來指點!!!
- 前言
- Linux下使用QT調用opencv讀取攝像頭視頻 調試心得
- Android開發 攝像頭SurfaceView預覽 背景帶矩形框 實現(原理:雙surfaceview,頂層畫矩形框,底層預覽視頻)
- Android開發:安裝NDK,移植OpenCV2.3.1,JNI調用OpenCV全過程
- 2013新春奉送:Android攝像頭開發完美demo---(循環聚焦,縮放大小,旋轉picture,查詢支持的picturesize, ImageButton按鍵效果)
- 如何設置ImageButton按鍵按下去后的 特效----(如類似風車旋轉的動畫特效)
- Android攝像頭:只拍攝SurfaceView預覽界面特定區域內容(矩形框)---完整實現(原理:底層SurfaceView+上層繪制ImageView)
- Android開發:SurfaceView上新建線程繪制旋轉圖片 及 刷新特定區域(臟矩形)
- Android開發:ImageView上繪制旋轉圓環(透明度不同的旋轉圓環,利用canvas.drawArc實現)
- Android上掌紋識別第一步:基于OpenCV的6種膚色分割 源碼和效果圖
- Android開發:實時處理攝像頭預覽幀視頻------淺析PreviewCallback,onPreviewFrame,AsyncTask的綜合應用
- Android攝像頭開發:拍照后添加相框,融合相框和圖片為一副 圖片
- Android(OpenCV) NDK開發: 0xdeadbaad(code=1)錯誤 及 關閉armeabi和libnative_camera_r2.2.2.so的生成
- Android攝像頭開發:實時攝像頭視頻預覽幀的編碼問題(二)
- setContentView切換頁面(無需每次都findViewById)-----二
- Android開發:setContentView切換界面,自定義帶CheckBox的ListView顯示SQlite條目-----實現