海康威视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的说明

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ2h1aXFpMjAwOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

该函数要求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也必须包括进project。

执行这个程序,能够捕获到图像。可是我计算了下时间。在调用 NET_DVR_CaptureJPEGPicture_NEW(lUserID,1,JpegPara,Jpeg,len,Ret);这一句话的时候,用时300ms。这个耗时太长,无法实时!

可是假设对实时无要求,用这个也能够了,好理解!

*********************************************************************************************
转载请注明出处:http://blog.csdn.net/wanghuiqi2008/article/details/31404571
*********************************************************************************************

捕获海康威视IPCamera图像,转成OpenCV能够处理的图像(一)的更多相关文章

  1. 捕获海康威视IPCamera图像,转成OpenCV能够处理的图像(二)

    海康威视IPCamera图像捕获 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图像(一) 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图 ...

  2. 代码测试:unsigned char*图像数据转换成OpenCV中Mat类型

    直接使用Mat的构造函数,把指针的位置赋给下面中的data就OK了: Mat(int rows, int cols, int type, void* data, size_t step=AUTO_ST ...

  3. javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...

  4. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  5. 深度图从ros数据类型转换成opencv数据类型

    摘要:ros下,利用realsense D435采集深度图,并将其转换成opencv的数据类型. 一. RGBD图像采集 通过image_transport包,根据给定的采集速度从realsense ...

  6. 图像滤波与OpenCV中的图像平滑处理

    .About图像滤波 频率:可以这样理解图像频率,图像中灰度的分布构成一幅图像的纹理.图像的不同本质上是灰度分布规律的不同.但是诸如"蓝色天空"样的图像有着大面积近似的灰度强度,而 ...

  7. OpenCV读取图像问题:OpenCV(3.4.3) D:\Build\OpenCV\opencv-size.width0 && size.height0 in function 'cvimshow'

    版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/83280067 - 问题与解决 最近正在学OpenCV,发现 ...

  8. Python下opencv使用笔记(图像频域滤波与傅里叶变换)

    Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654  收藏 展开 本文转载自  https://blog ...

  9. OpenCV 第二课 认识图像的存储结构

    OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...

随机推荐

  1. HDU 6040 Hints of sd0061(nth_element)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6040 [题目大意] 给出一个随机数生成器,有m个询问,问第bi小的元素是啥 询问中对于bi< ...

  2. BZOJ 3676 [Apio2014]回文串(回文树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3676 [题目大意] 考虑一个只包含小写拉丁字母的字符串s. 我们定义s的一个子串t的& ...

  3. 【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon

    题意:给你一个凸多边形,和多次询问,每次询问给你一条直线,问你这条直线与凸包上的顶点的最近距离是多少. 记当前询问的直线的斜率为K, 先找到与这条直线距离最远的两个点: 就把凸包所有的边当做有向直线进 ...

  4. 【模拟】 Codeforces Round #434 (Div. 1, based on Technocup 2018 Elimination Round 1) C. Tests Renumeration

    题意:有一堆数据,某些是样例数据(假设X个),某些是大数据(假设Y个),但这些数据文件的命名非常混乱.要你给它们一个一个地重命名,保证任意时刻没有重名文件的前提之下,使得样例数据命名为1~X,大数据命 ...

  5. bzoj 2073: [POI2004]PRZ

    2073: [POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的 ...

  6. mysql交叉表查询解决方案整理

    交叉表是一种常用的分类汇总查询.使用交叉表查询,可以显示表中某个字段的汇总值,并将它们分组,其中一组列在数据表的左侧,另一组列在数据表的上部.行和列的交叉处可以对数据进行多种汇总计算,如:求和.平均值 ...

  7. MongoDB 刷新几次就报错

    官方: MongoDB.Driver 在页面上 速度刷新几次,就会抛错? 为何? Service 层  Autofac

  8. 【java】实体类中 按照特定的字段 进行升序/降序 排序

    背景: 实际页面上  所有的分值都是按照JSON格式存储在一个字符串中 存储在同一个字段中: {"ownPTotal":"10>0","ownO ...

  9. php概率算法

    这是一个很经典的概率算法函数: function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr) ...

  10. OpenShift helm的安装

    1.安装过程 下载addons的代码 $ git clone https://github.com/jorgemoralespou/minishift-addons $ cd minishift-ad ...