OPENCV2.4.7+VS2010+海康威视摄像头
準備:VS2010,OpenCV2.4.7,海康威視網(wǎng)絡(luò)PTZ攝像頭,Win10操作系統(tǒng)。
一.攝像頭的安裝
1.按照說明書安裝好攝像頭,用網(wǎng)線連接在電腦上,配置電腦IP或者攝像頭IP,保證攝像頭和電腦在同一個網(wǎng)段,這時攝像頭會提醒成功連接網(wǎng)絡(luò)。
2.從海康威視官網(wǎng)上下載SADP并安裝(這個版本的SADP我下載下來以后裝上了卻用不了,后來我就下了比這個低一個版本的,可以使用),按照說明書在SADP中激活攝像頭即可,或者直接在瀏覽器中登入攝像頭的IP中,進行操作也可以,我是用瀏覽器激活的。
配置結(jié)束,在界面中會提醒下載插件,
按照提示安裝好插件,注意在安裝插件時關(guān)掉瀏覽器。安裝好插件以后重新登陸,就可以看到攝像頭的畫面了。
二.SDK環(huán)境配置配置
1.opencv的環(huán)境配置
? 這里和前面的opencv配置一致,提示:將需要用到的屬性頁單獨建立出來,以后要用的時候可以直接添加進去。
2.海康威視SDK的配置
?(1)下載SDK
??? 進入海康威視官網(wǎng),下載SDK。切記:如果你的opencv用的是32位操作臺,SDK要用32位的,我的電腦是64 位的,但是我的vs2010用的是32位,所以我用的海康威視SDK也是32位的。
2.將下載好的SDK里的“庫文件”改名為“l(fā)ib”,將“頭文件”改名為“include”,在vs2010的屬性里添加這個目錄。
添加庫文件:既要添加庫文件lib也要把lib下的HCNetSDKCom文件包含進去。
添加依賴項:
GdiPlus.lib HCCore.lib HCNetSDK.LIB PlayCtrl.lib HCAlarm.lib HCGeneralCfgMgr.lib HCPreview.lib?
3.環(huán)境變量配置
??? 添加包含.dll文件的目錄。
4.在網(wǎng)頁里打開攝像頭,運行一下代碼:
#include "stdafx.h" #include<cstdlib> #include<cstring> #include<iostream> #include"Windows.h" #include"HCNetSDK.h" #include "plaympeg4.h" #include <opencv2\opencv.hpp> #include <time.h>using namespace std;using namespace cv;LONG nPort = -1; volatile int gbHandling = 3;//解碼回調(diào) 視頻為YUV數(shù)據(jù)(YV12),音頻為PCM數(shù)據(jù)void CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2){if (gbHandling){gbHandling--;return;}long lFrameType = pFrameInfo->nType;if (lFrameType == T_YV12){Mat pImg(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3);Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, pBuf);cvtColor(src, pImg, CV_YUV2BGR_YV12);//? Sleep(-1);imshow("IPCamera", pImg);waitKey(1); }gbHandling = 3; }///實時流回調(diào)void CALLBACK fRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser) { switch (dwDataType){case NET_DVR_SYSHEAD: //系統(tǒng)頭if (!PlayM4_GetPort(&nPort))? //獲取播放庫未使用的通道號{break;}//m_iPort = lPort; //第一次回調(diào)的是系統(tǒng)頭,將獲取的播放庫port號賦值給全局port,下次回調(diào)數(shù)據(jù)時即使用此port號播放if (dwBufSize > 0){if(!PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME))? //設(shè)置實時流播放模式{break;}if (!PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 10 * 1024 * 1024)) //打開流接口{break;}if (!PlayM4_Play(nPort, NULL)) //播放開始{break;}if (!PlayM4_SetDecCallBack(nPort, DecCBFun)){break;}}break;case NET_DVR_STREAMDATA:?? //碼流數(shù)據(jù)if (dwBufSize > 0 && nPort != -1){if (!PlayM4_InputData(nPort, pBuffer, dwBufSize)){cout << "error" << PlayM4_GetLastError(nPort) << endl;break;}}break;default: //其他數(shù)據(jù)if (dwBufSize > 0 && nPort != -1){if (!PlayM4_InputData(nPort, pBuffer, dwBufSize)){break;}}break;} }void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser){ char tempbuf[256] = { 0 };switch (dwType){case EXCEPTION_RECONNECT:??? //預(yù)覽時重連printf("----------reconnect--------%d\n", time(NULL));break;default:break;} }void main(){?? //---------------------------------------// 初始化NET_DVR_Init();//設(shè)置連接時間與重連時間NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);//---------------------------------------// 注冊設(shè)備LONG lUserID;NET_DVR_DEVICEINFO_V30 struDeviceInfo;lUserID = NET_DVR_Login_V30("192.168.1.64", 8000, "admin", "a123456789", &struDeviceInfo);if (lUserID < 0){printf("Login error, %d\n", NET_DVR_GetLastError());NET_DVR_Cleanup();return;}//---------------------------------------//設(shè)置異常消息回調(diào)函數(shù)NET_DVR_SetExceptionCallBack_V30(0,NULL,g_ExceptionCallBack,NULL); //---------------------------------------//啟動預(yù)覽并設(shè)置回調(diào)數(shù)據(jù)流LONG lRealPlayHandle;cvNamedWindow("Mywindow", 0);cvNamedWindow("IPCamera", 0);HWND? h = (HWND)cvGetWindowHandle("Mywindow");if (h == 0){ cout << "窗口創(chuàng)建失敗" << endl; }NET_DVR_PREVIEWINFO struPlayInfo = { 0 };struPlayInfo.hPlayWnd = h;???????? //需要SDK解碼時句柄設(shè)為有效值,僅取流不解碼時可設(shè)為空struPlayInfo.lChannel = 1;?????????? //預(yù)覽通道號struPlayInfo.dwStreamType = 0;?????? //0-主碼流,1-子碼流,2-碼流3,3-碼流4,以此類推struPlayInfo.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTPlRealPlayHandle=NET_DVR_RealPlay_V40(lUserID,&struPlayInfo,fRealDataCallBack,NULL);if (lRealPlayHandle < 0){printf("NET_DVR_RealPlay_V40 error\n");printf("%d\n", NET_DVR_GetLastError());NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return;}waitKey();Sleep(-1);//---------------------------------------//關(guān)閉預(yù)覽NET_DVR_StopRealPlay(lRealPlayHandle);//注銷用戶NET_DVR_Logout(lUserID);//釋放SDK資源NET_DVR_Cleanup();return; }?
5.運行結(jié)果如下:
參考博客:
(1)OpenCV+海康威視攝像頭的實時讀取 http://blog.csdn.net/lonelyrains/article/details/50350052
(2)OpenCV+海康威視攝像頭的實時讀取? http://blog.csdn.net/bbzz2/article/details/53214579
(3)opencv讀取海康威視攝像頭http://blog.csdn.net/shakevincent/article/details/51490197
(4)海康威視攝像頭的讀取(vs2010+opencv2.4.9)http://blog.csdn.net/wangdeyu1994/article/details/76284087
總結(jié)
以上是生活随笔為你收集整理的OPENCV2.4.7+VS2010+海康威视摄像头的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做算法,为什么建议你一定要学懂C++?
- 下一篇: 免费!200块全志XR806开源鸿蒙开发