日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(一)

發布時間:2024/3/12 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

海康威視IPCamera圖像捕獲


捕獲海康威視IPCamera圖像,轉成OpenCV可以處理的IplImage圖像(一)

捕獲海康威視IPCamera圖像,轉成OpenCV可以處理的IplImage圖像(二)


所使用海康威視攝像頭型號:DS-2CD4026FWD-(A)(P)


海康威視IPCamera圖像捕獲方法有兩種:

(1)利用SDK里面的NET_DVR_CaptureJPEGPicture_NEW進行視頻抓圖

(2)捕獲實時流,將實時流解碼成YV12,然后轉換成RGB


在這篇博文里,我先介紹第一種方法。

第一種方法,關鍵是調用NET_DVR_CaptureJPEGPicture_NEW這個函數。關于這個函數的參數,可以在SDK中找到,我這里截個圖以作說明。


這個函數Ret是用于返回該圖像大小的一個參數,但是該函數的這個參數大概是沒有用引用或者指針的方式來傳遞參數,導致返回值一直是我初始化的0,因此為后面的操作帶來了些許的不便——不得不使用一個較大的內存來保存圖像一定能存儲的下。

NET_DVR_CaptureJPEGPicture_NEW這個函數是將單幀數據捕獲并保存成JPEG,存放在指定的內存空間中。也就是內存里的JPEG。為了獲得OpenCV能處理的IplImage圖像,必須在內存中進行解碼。

OpenCV在內存中解碼的函數只有一個:imdecode,下圖是imdecode的說明


該函數要求buf必須是數組或者是byte類型的vector. 因此需要對char * 類型的JPEG壓縮圖像進行存儲格式轉換。


#include <cstdio> #include <iostream> #include <ctime> #include <Windows.h> #include "HCNetSDK.h" #include "highgui.h" #include "cv.h"using namespace cv; using namespace std;//typedef HWND (WINAPI *PROCGETCONSOLEWINDOW)(); //PROCGETCONSOLEWINDOW GetConsoleWindow;int main(int argc, char * argv[]) { //---------------------------------------// 初始化NET_DVR_Init();//設置連接時間與重連時間NET_DVR_SetConnectTime(2000, 1);NET_DVR_SetReconnect(10000, true);//---------------------------------------//獲取控制臺窗口句柄//HMODULE hKernel32 = GetModuleHandle((LPCWSTR)"kernel32");//GetConsoleWindow = (PROCGETCONSOLEWINDOW)GetProcAddress(hKernel32,"GetConsoleWindow");//---------------------------------------// 注冊設備LONG lUserID;NET_DVR_DEVICEINFO_V30 struDeviceInfo;lUserID = NET_DVR_Login_V30("10.102.7.88", 8000, "admin", "12345", &struDeviceInfo);if (lUserID < 0){printf("Login error, %d\n", NET_DVR_GetLastError());NET_DVR_Cleanup();return -1;} //---------------------------------------//cvNamedWindow("camera",CV_WINDOW_AUTOSIZE);IplImage* frame;//定義JPEG圖像質量LPNET_DVR_JPEGPARA JpegPara = new NET_DVR_JPEGPARA;JpegPara->wPicQuality = 0;JpegPara->wPicSize = 9;char * Jpeg = new char[200*1024];DWORD len = 200*1024;LPDWORD Ret = 0;if(!NET_DVR_SetCapturePictureMode(BMP_MODE)){cout<<"Set Capture Picture Mode error!"<<endl;cout<<"The error code is "<<NET_DVR_GetLastError()<<endl;}//bool capture = NET_DVR_CaptureJPEGPicture(lUserID,1,JpegPara,"1111");vector<char>data(200*1024);while(1){bool capture = NET_DVR_CaptureJPEGPicture_NEW(lUserID,1,JpegPara,Jpeg,len,Ret);if(!capture){printf("Error: NET_DVR_CaptureJPEGPicture_NEW = %d", NET_DVR_GetLastError());return -1; } for(int i=0;i<200*1024;i++)data[i] = Jpeg[i];Mat img = imdecode(Mat(data),1);imshow("camera",img);waitKey(1);}//FILE * fp = fopen("3.jpg","wb");//fwrite(Jpeg,1,123*1024,fp);//fclose(fp);return 0; }
運行這個代碼當然OpenCV的配置不能少,HCNetSDK.h也必須包含進工程。

運行這個程序,可以捕獲到圖像,但是我計算了下時間,在調用?NET_DVR_CaptureJPEGPicture_NEW(lUserID,1,JpegPara,Jpeg,len,Ret);這一句話的時候,用時300ms,這個耗時太長,無法實時!但是如果對實時無要求,用這個也可以了,好理解!

********************************************************************************************* 轉載請注明出處:http://blog.csdn.net/wanghuiqi2008/article/details/31404571 *********************************************************************************************



總結

以上是生活随笔為你收集整理的捕获海康威视IPCamera图像,转成OpenCV可以处理的图像(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。