捕获海康威视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,这个耗时太长,无法实时!但是如果对实时无要求,用这个也可以了,好理解!

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

时间: 2024-11-05 20:43:01

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

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

海康威视IPCamera图像捕获 捕获海康威视IPCamera图像,转成OpenCV能够处理的IplImage图像(一) 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图像(二) 所使用海康威视摄像头型号:DS-2CD4026FWD-(A)(P) 海康威视IPCamera图像捕获方法有两种: (1)利用SDK里面的NET_DVR_CaptureJPEGPicture_NEW进行视频抓图 (2)捕获实时流.将实时流解码成YV12,然后转换成RGB 在这篇博文里.我先介

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

海康威视IPCamera图像捕获 捕获海康威视IPCamera图像,转成OpenCV可以处理的IplImage图像(一) 捕获海康威视IPCamera图像,转成OpenCV可以处理的IplImage图像(二) 所使用海康威视摄像头型号:DS-2CD4026FWD-(A)(P) 海康威视IPCamera图像捕获方法有两种: (1)利用SDK里面的NET_DVR_CaptureJPEGPicture_NEW进行视频抓图 (2)捕获实时流,将实时流解码成YV12,然后转换成RGB 在这篇博文里,我将介

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

海康威视IPCamera图像捕获 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图像(一) 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图像(二) 所使用海康威视摄像头型号:DS-2CD4026FWD-(A)(P) 海康威视IPCamera图像捕获方法有两种: (1)利用SDK里面的NET_DVR_CaptureJPEGPicture_NEW进行视频抓图 (2)捕获实时流.将实时流解码成YV12,然后转换成RGB 在上一篇博文里,我介

深度学习文章3:将自己的图像数据转换成caffe需要的db(leveldb/lmdb)文件

将自己的图像数据转换成caffe需要的db(leveldb/lmdb)文件 在搭建好caffe环境之后,我们往往需要对自己的图像数据进行训练/测试,我们的图像数据往往时图片文件,如jpg,jpeg,png等,然而在caffe中我们需要使用的数据类型是lmdb或leveldb,例如:在之前测试MNIST数据集< 深度学习文章2:使用MNIST数据集验证Caffe是否安装成功 >时,我们运行脚本create_mnist.sh就是生成对应的db文件,运行后在~/caffe/examples/mnis

【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边

图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性.(摘自网络) 图像滤波的目的 1,消除图像中混入的噪声 2,为图像识别抽取出图像特征 图像滤波的要求 1,不能损坏图像轮廓及边缘 2,图像视觉效果应当更好 滤波器的定义 滤波器,顾名思义,是对波进行过滤的器件.(摘自网络) 以上的定义是针对物理器件的,但对于图像滤波而言显然也是适用的. 大家都用过放大镜,这里就

opencv分水岭算法对图像进行切割

先看效果 说明 使用分水岭算法对图像进行切割,设置一个标记图像能达到比較好的效果,还能防止过度切割. 1.这里首先对阈值化的二值图像进行腐蚀,去掉小的白色区域,得到图像的前景区域.并对前景区域用255白色标记 2.相同对阈值化后的图像进行膨胀,然后再阈值化并取反.得到背景区域. 并用128灰度表示 3.将前景和背景叠加在一起在同一幅图像中显示. 4.用标记图和原图,利用opencv的watershed对图像进行切割. 源代码 class WatershedSegment{ private: cv

opencv分水岭算法对图像进行分割

先看效果 说明 使用分水岭算法对图像进行分割,设置一个标记图像能达到比较好的效果,还能防止过度分割. 1.这里首先对阈值化的二值图像进行腐蚀,去掉小的白色区域,得到图像的前景区域.并对前景区域用255白色标记 2.同样对阈值化后的图像进行膨胀,然后再阈值化并取反.得到背景区域.并用128灰度表示 3.将前景和背景叠加在一起在同一幅图像中显示. 4.用标记图和原图,利用opencv的watershed对图像进行分割. 源码 class WatershedSegment{ private: cv::

opencv中的meanshift图像切割

Meanshift(均值漂移)是一种在一组数据的密度分布中寻找局部极值的稳定的方法.Meanshift不仅能够用于图像滤波,视频跟踪,还能够用于图像切割. 通过给出一组多维数据点,其维数是(x,y,r,g,b),均值漂移能够用一个窗体扫描空间来找到数据密度最大的区域,能够理解为数据分布最集中的区域. 在这里须要注意,因为空间位置(也就是上面的x和y)的变化范围与颜色的变化范围(上面的r,g,b)有极大的不同,所以,meanshift对这两个维数要採用不同的窗体半径.在opencv自带的means

OpenCV 载入一副图像并进行平滑处理

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/33758877 一.使用OpenCV载入一副图像并进行平滑处理 #include "opencv\highgui.h" #include "opencv\cv.h" int main() { cvNamedWindow("平滑前"); //创建窗体 cvNamedWindow("平滑后"); //创建窗体 I