生活随笔
收集整理的這篇文章主要介紹了
网络摄像头实时获取信息
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自:http://blog.csdn.net/yong_hen/article/details/42460387#quote
轉(zhuǎn)自:http://blog.csdn.net/leo2007608/article/details/9885219
代碼:
openCV版本:2.4.10.
平臺(tái):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);?? ????}?? } ?
相關(guān)問題:
要解決問題:
?opencv無法正常回放視頻(原因是VideoCapture::set 函數(shù)里只有一種關(guān)鍵幀模式,詳情參見《OpenCV 2.3.1 中關(guān)于cvCaptureProperty()定位不準(zhǔn)的問題》)
解決方案:
上面給出的鏈接文章已經(jīng)給出了這一問題的解決方案,但是過于籠統(tǒng)(我懷疑他們應(yīng)該是使用的linux系統(tǒng)),在windows下這一編譯過程可以用坑爹來形容。好吧,讓我們來回顧一下這一坑爹之旅。
1 要修改的代碼部分請(qǐng)參見OpenCV 2.3.1 中關(guān)于cvCaptureProperty()定位不準(zhǔn)的問題?這里不再重復(fù)
2 關(guān)鍵的問題來了:我在windows下使用cmake安裝opencv的時(shí)候,根本就沒有WITH_FFMPEG這個(gè)選項(xiàng),而在網(wǎng)上查到的解決方案都是通過修改cmake而直接搞定的,簡(jiǎn)直可謂是輕松愉快加嗨皮?,下面給出windows下需要修改的一些內(nèi)容。
2.1 先說ffmpeg的下載安裝。由于一開始不是很清楚,就去ffmpeg的網(wǎng)站上下了最新版本編譯好的程序,結(jié)果死活有函數(shù)找不到。后來google后發(fā)現(xiàn),原來是因?yàn)閛pencv使用的是0.7x版本的ffmpeg,下載的時(shí)候大家注意一下。http://ffmpeg.zeranoe.com/builds/在這里下載,我是懶人,我下的編譯完的版本。下載完,你怎么配置環(huán)境變量我就不管了,反正最后重新編譯opencv時(shí)你能想起來就行。
2.2 然后我們可以打開opencv文件夾下面?CMakeLists.txt 這個(gè)文件發(fā)現(xiàn)
[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環(huán)境下才會(huì)有WITH_FFMPEG這個(gè)選項(xiàng),好吧,往下的牛人可以直接修改這個(gè)txt了,來構(gòu)造自己的cmakelist文件,可惜我對(duì)cmake不是很熟,不是很敢修改這些代碼,于是乎我就采用了一個(gè)笨一些的方法,手動(dòng)去修改cmake生成的項(xiàng)目配置文件
找到opencv_highgui這個(gè)項(xiàng)目,打開cap_ffmpeg.cpp文件,你會(huì)發(fā)現(xiàn)這么一段預(yù)編譯代碼
[html]?view plaincopy
#ifdef?HAVE_FFMPEG?? #include?"cap_ffmpeg_impl.hpp"?? #else?? #include?"cap_ffmpeg_api.hpp"?? #endif??
由于windows下的CMAKE沒有預(yù)定義HAVE_FFMPEG 所以說我們需要在預(yù)編譯指令里面加上HAVE_FFMPEG,位置在項(xiàng)目->屬性-> c++ ->預(yù)處理器定義
2.3?下一步是將你的ffmpeg庫(kù)的include文件夾加到highgui項(xiàng)目中去,不想細(xì)說了,還有就是ffmpeg中的靜態(tài)鏈接庫(kù)。這些沒有什么難度。然后編譯一下,ok,滿屏的錯(cuò)誤。
轉(zhuǎn)到cap_ffmpeg_impl.hpp文件,大部分的錯(cuò)誤是從這里來的
2.3.1?找不到msinttypes.h文件 上這里下載?http://code.google.com/p/msinttypes/?然后塞進(jìn)項(xiàng)目去就行了。
2.3.2?INT64_C,?UINT64_C 沒定義, 自己定義一下就可以了。在文件中加入
[html]?view plaincopy
#define?INT64_C?? #define?UINT64_C??
2.3.3 如果提示av_open_input_file 找不到,恭喜你,你沒好好看前面的內(nèi)容,你下錯(cuò)ffmpeg啦~~ 要
0.7x
版本~~
2.3.4 如果報(bào)錯(cuò) snprintf 這個(gè)函數(shù)找不到,我不知道這個(gè)函數(shù)在那個(gè)頭文件里,我加上了<stdio>結(jié)果沒找到,如果你知道的話就加上對(duì)應(yīng)頭文件就好了。或者你可以像我似的,使用一個(gè)把這個(gè)函數(shù)改成sprintf版本
[html]?view plaincopy
//snprintf(oc->filename,?sizeof(oc->filename),?"%s",?filename);?? ????sprintf(oc->filename,?filename,?"%s");??
2.3.5 我就遇到了4個(gè)要修改的地方,如果你又遇到別的錯(cuò)誤,那只好自己慢慢修改了。
2.3.6 重新編譯highgui項(xiàng)目,替換原有的lib,dll文件。
2.3.7 PS, 貌似還需要?jiǎng)h除opencv_ffmpeg.dll文件,這樣才能調(diào)用正確的幀跳轉(zhuǎn)方法,但是刪除opencv_ffmpeg后,程序就無法讀取非avi類型媒體文件。 目前原因不明,有時(shí)間在慢慢鼓搗吧。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的网络摄像头实时获取信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。