生活随笔
收集整理的這篇文章主要介紹了
网络摄像头实时获取信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:http://blog.csdn.net/yong_hen/article/details/42460387#quote
轉自:http://blog.csdn.net/leo2007608/article/details/9885219
代碼:
openCV版本:2.4.10.
平臺:win7
[cpp]?view plaincopy
#include?<opencv2/core/core.hpp>?? #include?<opencv2/highgui/highgui.hpp>?? #include?<opencv2/imgproc/imgproc.hpp>?? ?? void?constructionPerspectiveMat(CvSize?size,?cv::Mat?&warp_mat)?? {?? ????cv::Point2f?srcTri[4],?dstTri[4];??? ?????? ????srcTri[0].x?=?0;?? ????srcTri[0].y?=?0;?? ????srcTri[1].x?=?size.width?-?1.0f;???? ????srcTri[1].y?=?0;?? ????srcTri[2].x?=?0;?? ????srcTri[2].y?=?size.height?-?1.0f;?? ????srcTri[3].x?=?size.width?-?1.0f;???? ????srcTri[3].y?=?size.height?-?1.0f;?? ?? ?????? ?????? ????dstTri[0].x?=?0?*?1.0f;?? ????dstTri[0].y?=?0?*?1.0f;?? ????dstTri[1].x?=?srcTri[1].x?*?1.0f?-?50;?? ????dstTri[1].y?=?100?*?1.0f;?? ????dstTri[2].x?=?100?*?1.0f;?? ????dstTri[2].y?=?srcTri[2].y?*?1.0f;?? ????dstTri[3].x?=?srcTri[3].x?*?1.0f;?? ????dstTri[3].y?=?srcTri[3].y?*?1.0f;?? ?????? ????warp_mat?=?cv::getPerspectiveTransform(srcTri,?dstTri);?? }?? ?? int?main(int?argc,?char?*argv[])?? {?? ????cv::VideoCapture?capture(argv[1]);?? ?? ????if?(!capture.isOpened())?{?? ?????????? ????}?? ?? ????cv::Mat?frame,?Dst,?WarpMat;?? ?? ????capture.read(frame);?? ????CvSize?size;?? ????size.width?=?frame.cols;?? ????size.height?=?frame.rows;?? ????WarpMat.create(cvSize(3,?3),?CV_32FC1);?? ????constructionPerspectiveMat(size,?WarpMat);?? ?????? ????cv::namedWindow("TEST",?CV_WINDOW_AUTOSIZE);?? ????int?i?=?1000;?? ????while?(--i)?{?? ????????if?(!capture.read(frame))?{?? ?????????????? ????????}?? ?? ????????cv::warpPerspective(frame,?Dst,?WarpMat,?size);?? ????????cv::imshow("TEST",?Dst);?? ?? ????????cv::waitKey(30);?? ????}?? } ?
相關問題:
要解決問題:
?opencv無法正常回放視頻(原因是VideoCapture::set 函數里只有一種關鍵幀模式,詳情參見《OpenCV 2.3.1 中關于cvCaptureProperty()定位不準的問題》)
解決方案:
上面給出的鏈接文章已經給出了這一問題的解決方案,但是過于籠統(我懷疑他們應該是使用的linux系統),在windows下這一編譯過程可以用坑爹來形容。好吧,讓我們來回顧一下這一坑爹之旅。
1 要修改的代碼部分請參見OpenCV 2.3.1 中關于cvCaptureProperty()定位不準的問題?這里不再重復
2 關鍵的問題來了:我在windows下使用cmake安裝opencv的時候,根本就沒有WITH_FFMPEG這個選項,而在網上查到的解決方案都是通過修改cmake而直接搞定的,簡直可謂是輕松愉快加嗨皮?,下面給出windows下需要修改的一些內容。
2.1 先說ffmpeg的下載安裝。由于一開始不是很清楚,就去ffmpeg的網站上下了最新版本編譯好的程序,結果死活有函數找不到。后來google后發現,原來是因為opencv使用的是0.7x版本的ffmpeg,下載的時候大家注意一下。http://ffmpeg.zeranoe.com/builds/在這里下載,我是懶人,我下的編譯完的版本。下載完,你怎么配置環境變量我就不管了,反正最后重新編譯opencv時你能想起來就行。
2.2 然后我們可以打開opencv文件夾下面?CMakeLists.txt 這個文件發現
[html]?view plaincopy
if(UNIX)?? ????set(WITH_FFMPEG?ON?CACHE?BOOL?"Include?FFMPEG?support")?? ????if(NOT?APPLE)?? ????????set(WITH_UNICAP?OFF?CACHE?BOOL?"Include?Unicap?support?(GPL)")?? ????????set(WITH_GTK?ON?CACHE?BOOL?"Include?GTK?support")?? ????????set(WITH_GSTREAMER?ON?CACHE?BOOL?"Include?Gstreamer?support")?? ????????set(WITH_V4L?ON?CACHE?BOOL?"Include?Video?4?Linux?support")?? ????????set(WITH_XINE?OFF?CACHE?BOOL?"Include?Xine?support?(GPL)")?? ????endif()?? ????set(WITH_PVAPI?ON?CACHE?BOOL?"Include?Prosilica?GigE?support")?? ????set(WITH_1394?ON?CACHE?BOOL?"Include?IEEE1394?support")?? endif()??
通過上面代碼可以看出來,只有在UNIX環境下才會有WITH_FFMPEG這個選項,好吧,往下的牛人可以直接修改這個txt了,來構造自己的cmakelist文件,可惜我對cmake不是很熟,不是很敢修改這些代碼,于是乎我就采用了一個笨一些的方法,手動去修改cmake生成的項目配置文件
找到opencv_highgui這個項目,打開cap_ffmpeg.cpp文件,你會發現這么一段預編譯代碼
[html]?view plaincopy
#ifdef?HAVE_FFMPEG?? #include?"cap_ffmpeg_impl.hpp"?? #else?? #include?"cap_ffmpeg_api.hpp"?? #endif??
由于windows下的CMAKE沒有預定義HAVE_FFMPEG 所以說我們需要在預編譯指令里面加上HAVE_FFMPEG,位置在項目->屬性-> c++ ->預處理器定義
2.3?下一步是將你的ffmpeg庫的include文件夾加到highgui項目中去,不想細說了,還有就是ffmpeg中的靜態鏈接庫。這些沒有什么難度。然后編譯一下,ok,滿屏的錯誤。
轉到cap_ffmpeg_impl.hpp文件,大部分的錯誤是從這里來的
2.3.1?找不到msinttypes.h文件 上這里下載?http://code.google.com/p/msinttypes/?然后塞進項目去就行了。
2.3.2?INT64_C,?UINT64_C 沒定義, 自己定義一下就可以了。在文件中加入
[html]?view plaincopy
#define?INT64_C?? #define?UINT64_C??
2.3.3 如果提示av_open_input_file 找不到,恭喜你,你沒好好看前面的內容,你下錯ffmpeg啦~~ 要
0.7x
版本~~
2.3.4 如果報錯 snprintf 這個函數找不到,我不知道這個函數在那個頭文件里,我加上了<stdio>結果沒找到,如果你知道的話就加上對應頭文件就好了?;蛘吣憧梢韵裎宜频?#xff0c;使用一個把這個函數改成sprintf版本
[html]?view plaincopy
//snprintf(oc->filename,?sizeof(oc->filename),?"%s",?filename);?? ????sprintf(oc->filename,?filename,?"%s");??
2.3.5 我就遇到了4個要修改的地方,如果你又遇到別的錯誤,那只好自己慢慢修改了。
2.3.6 重新編譯highgui項目,替換原有的lib,dll文件。
2.3.7 PS, 貌似還需要刪除opencv_ffmpeg.dll文件,這樣才能調用正確的幀跳轉方法,但是刪除opencv_ffmpeg后,程序就無法讀取非avi類型媒體文件。 目前原因不明,有時間在慢慢鼓搗吧。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的网络摄像头实时获取信息的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。