使用opencv获取海康IPC摄像头教程
2015-10-22 22:15
561 查看
海康威视IPCamera图像捕获
海康威视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,这个耗时太长,无法实时!但是如果对实时无要求,用这个也可以了,好理解!
转载请注明出处:/article/1564584.html
相关文章推荐
- UVA10934 Dropping water balloons(dp状态比较难想)
- Linux 循环遍历文件目录
- linux下使用yum安装mysql详解
- 《学习OpenCV》第五章课后题3
- linux 批量修改文件后缀名
- 为perf4j提供集中式监控项目perf4j-dashboard
- OpenCV-图像模糊
- NSOperation的基本使用——本质是对GCD的封装
- 第三十八天:分区 -- Parte
- HDOJ 题目3853 LOOPS(概率DP)
- Linux下fork()函数
- Linux监控软件之 Zabbix
- Tomcat设计模式分析(转) 2
- Tomcat 工作原理 1 (转)
- nginx配置域名重定向
- 使用Openssl构建私有CA
- linux----LAMP之编译安装apache
- Centos6.6安装简易桌面环境
- 研究SLAM网站和有用站点-sourcecode+测试数据
- linux编辑网口地址