(注:第一种方法是我的原创 ^_^。 第二种方法是从网上学习的。)

第一种方法:利用 板卡的API:  GetJpegImage 得到 Jpeg 格式的图像数据,然后用opencv里的一个函数进行解码,得到IplImage对象。(我很郁闷海康威视采集卡为什么不直接提供RGB图像数据,而是提供了一个Jpeg数据给用户。)

libjpeg库就是专门处理 jpeg 格式的图像数据的,包括解码缩jpeg 格式的图像等。

opencv的库依赖于libjpeg库。我看了libjpeg库的源代码,然后又看了opencv 里 cvLoadImage这部分的源代码,发现opencv已经封装好了一个图像解码器: cvImageDecoder.

而且opencv的API 还提供了一个解码 内存中的图像数据的函数:

CVAPI(IplImage*) cvDecodeImage( const CvMat* buf, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));

先生成CvMat*,然后直接调用 cvDecodeImage 即可,以下是部分源代码:

 void testCardAPI()
{
HANDLE channelHandle ;
DWORD nport; //initialize the card SetDefaultVideoStandard(StandardPAL); //returns 0 if error //返回通道个数
int nChannels = InitDSPs(); if( nChannels > )
{ //try to open any Channel
for(int i = ; i < GetTotalChannels() ; i++)
{
channelHandle = ChannelOpen( i );
if( (unsigned int)channelHandle != 0xFFFFFFFF )
{
//此处有疑问,nport 不知道是什么
nport = i ;
break;
}
} //system("pause"); // 如果 open channel 成功
if( (unsigned int)channelHandle != 0xFFFFFFFF )
{
//注册画图回调函数
//RegisterDrawFun(); SetOverlayColorKey( RGB(,,) ); //设置视频预览模式: overlay
int supportOverlayFlag = SetPreviewOverlayMode( true ); if( supportOverlayFlag != )
{
//不支持 overlay, 就报错
} //CWnd wnd;
//wnd.m_hwnd; // StartVideoPreview( channelHandle, wnd.GetSafeHwnd() ,
UCHAR imageBuf[ * * ];
DWORD Size = * * ;
DWORD hSize= * * ;
UCHAR *imageBuffer=new UCHAR[hSize];
cvNamedWindow("image",);
while()
{
GetJpegImage(channelHandle, imageBuf, &Size, ); CvMat mat = cvMat(,,CV_8UC1, imageBuf); IplImage *pIplImage = cvDecodeImage( &mat, ); //memcpy(imageBuffer,imageBuf,Size);
//IplImage *pIplImage=cvCreateImage(cvSize(704,576),8,1);
if(pIplImage)
{
//memcpy(pIplImage->imageData,imageBuf,Size);
cvShowImage("image",pIplImage);
cvReleaseImage(&pIplImage);
}
if(cvWaitKey()==)
break;
} }
}
}

第一种方法运行起来有点慢,可能是解压图片数据要耗时间罢。

第二种方法:从yuv422得到灰度图像,然后生成IplImage对象。

采集卡输出的是 原始yuv422格式图像

以下程序仅可以 实现 灰度图像(只提取了Y分量)的输出。

如果想得到彩色图像,还需要把  yuv422格式图像 转成 RGB格式的

以下是一段 简单的 视频卡驱动 和 用openCV显示图像的代码

 // TestSDK.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #define _AFXDLL
#include <afxwin.h> #include "cv.h"
#include "highgui.h" #pragma comment (lib, "DS40xxSDK.lib") #include "DataType.h"
#include "HikVisionSdk.h" void testCardAPI(); int _tmain(int argc, _TCHAR* argv[])
{
testCardAPI();
return ;
} void testCardAPI()
{
HANDLE channelHandle ;
DWORD nport; //initialize the card SetDefaultVideoStandard(StandardPAL); //returns 0 if error //返回通道个数
int nChannels = InitDSPs(); if( nChannels > )
{ //try to open any Channel
for(int i = ; i < GetTotalChannels() ; i++)
{
channelHandle = ChannelOpen( i );
if( (unsigned int)channelHandle != 0xFFFFFFFF )
{
//此处有疑问,nport 不知道是什么
nport = i ;
break;
}
} //system("pause"); // 如果 open channel 成功
if( (unsigned int)channelHandle != 0xFFFFFFFF )
{
//注册画图回调函数
//RegisterDrawFun(); SetOverlayColorKey( RGB(,,) ); //设置视频预览模式: overlay
int supportOverlayFlag = SetPreviewOverlayMode( true ); if( supportOverlayFlag != )
{
//不支持 overlay, 就报错
} //CWnd wnd;
//wnd.m_hwnd; // StartVideoPreview( channelHandle, wnd.GetSafeHwnd() ,
UCHAR imageBuf[ * *];
DWORD Size = * *;
DWORD hSize= * ;
UCHAR *imageBuffer=new UCHAR[hSize];
cvNamedWindow("image",);
while()
{
GetOriginalImage(channelHandle, imageBuf, &Size);
memcpy(imageBuffer,imageBuf,hSize);
IplImage *pIplImage=cvCreateImage(cvSize(,),IPL_DEPTH_8U,);
if(pIplImage)
{
memcpy(pIplImage->imageData,imageBuffer,hSize);
cvShowImage("image",pIplImage);
cvReleaseImage(&pIplImage);
}
if(cvWaitKey()==)
break;
} }
}
}

关键之处在

 UCHAR imageBuf[ * *];
DWORD Size = * *;
DWORD hSize= * ;
UCHAR *imageBuffer=new UCHAR[hSize];
cvNamedWindow("image",);
while()
{
GetOriginalImage(channelHandle, imageBuf, &Size);
memcpy(imageBuffer,imageBuf,hSize);
IplImage *pIplImage=cvCreateImage(cvSize(,),IPL_DEPTH_8U,);
if(pIplImage)
{
memcpy(pIplImage->imageData,imageBuffer,hSize);
cvShowImage("image",pIplImage);
cvReleaseImage(&pIplImage);
}
if(cvWaitKey()==)
break;
}

海康威视采集卡结合opencv使用(两种方法)-转的更多相关文章

  1. php如何防止图片盗用/盗链的两种方法

    如今的互联网,采集网站非常多,很多网站都喜欢盗链/盗用别人网站的图片,这样不仅侵犯网权,还导致被盗链的网站消耗大量的流量,给服务器造成比较大的压力,本文章向大家介绍php如何防止图片盗用/盗链的两种方 ...

  2. MyEclipse取消验证Js的两种方法

    MyEclipse取消验证Js的两种方法 作者: 字体:[增加 减小] 类型:转载 通过js写一个web工程的相关页面时感觉很卡,修改内存也不行下面有两种解决方法,大家可以尝试下 前言:有时我们通过j ...

  3. 相机标定 matlab opencv ROS三种方法标定步骤(1)

    一 . 理解摄像机模型,网上有很多讲解的十分详细,在这里我只是记录我的整合出来的资料和我的部分理解 计算机视觉领域中常见的三个坐标系:图像坐标系,相机坐标系,世界坐标系,实际上就是要用矩阵来表 示各个 ...

  4. Python3求笛卡尔积的两种方法

    [本文出自天外归云的博客园] 电影异次元杀阵三部曲中密室线索反复出现笛卡尔积的运用.百度百科: 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为 ...

  5. 智能手机的耗电特征及APP耗电量测试的两种方法

    文章陈述了手机发展趋势及耗电特性,集中讨论了时下最为关心的智能手机耗电问题,并介绍了测量手机软件耗电量的两种方法.此外还解释了为何运营商此前会提出收取微信的费用,心跳机制是什么. 美国著名手机公司Pa ...

  6. Wireshark解密HTTPS流量的两种方法

    原理 我们先回顾一下SSL/TLS的整个握手过程: Clienthello:发送客户端的功能和首选项给服务器,在连接建立后,当希望重协商.或者响应服务器的重协商请求时会发送. version:客户端支 ...

  7. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  8. android 之 启动画面的两种方法

    现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...

  9. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

随机推荐

  1. 【225】ArcEngine 实现要素添加 & 删除

    参考:ArcGIS Engine效率探究——要素的添加和删除.属性的读取和更新 删除要素 //添加图层,显示在最上面 axMapControl1.AddShapeFile(@"D:\01-业 ...

  2. node本地服务启动报Error: listen EADDRINUSE解决方法

    Error: listen EADDRINUSE 127.0.0.1:1337 at Object.exports._errnoException (util.js:1018:11) at expor ...

  3. POI生成Excel工具类

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInp ...

  4. Flutter实战视频-移动电商-36.FlutterToast插件使用

    36.FlutterToast插件使用 https://github.com/PonnamKarthik/FlutterToast fluttertoast: ^ category_page.dart ...

  5. window.location js截取url地址

    window.location方法的说明 原文链接: http://jiantian.org/index.php?page_id=2 window.location.href 整个URl字符串(在浏览 ...

  6. PhpStorm之操作数据库

    对数据库进行基本的操作 还不清楚如何使用PhpStorm连接本地数据库的朋友看一下我的上一篇博客配置数据库连接 点击已经连接好的数据库,找到下图中的 Consoles,然后点击 console(def ...

  7. JavaScript数组及相关方法

    数组 1.创建数组 var array = new Array(); var array = new Array(size);//指定数组的长度 var array = new Array(item1 ...

  8. 使用js在html文档的任意位置输出内容

    <script type="text/javascript">document.write('这里是内容');</script>

  9. unity3d easytouch教程

    http://www.taikr.com/group/6/thread/1987 说一说easytouch的简单使用方法,和移动平台上的rpg游戏一样,我们肯定也不陌生,我们经常玩游戏的时候用的都是虚 ...

  10. 骨骼动画反向动力学(IK)的实现

    反向动力学,Inverse Kinematics,简称IK.简单地说,由父骨骼的方位和子骨骼的相对变换得到子骨骼的方位,称为正向动力学(Forward Kinematics,FK):而IK则是先确定子 ...