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

第一种方法:利用 板卡的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. MongoDB搭建ReplSet复制集群

    MongoDB的复制集是一个主从复制模式 又具有故障转移的集群,任何成员都有可能是master,当master挂掉用会很快的重新选举一个节点来充当master. 复制集中的组成主要成员 Primary ...

  2. bzoj5102

    $贪心$ $按左端点排序.$ $当我们钦定了最右的左端点,那么自然希望右端点尽量靠右$ $考虑之前的区间,那么我们相当于选之前的区间中第k大的右端点$ $堆维护一下就可以了,每次把新的元素放进堆,如果 ...

  3. 【旧文章搬运】关于在指定进程调用KeUserModeCallback的问题

    原文发表于百度空间,2010-10-07========================================================================== 由于KeU ...

  4. CodeForces 1098D. Eels

    题目简述:对一个非空正整数(可重)集合$S$,从中选出两个元素$a, b (a \leq b)$,将他们从$S$中删除并将$a+b$加入$S$,重复这个操作直到$S$中只剩下一个元素为止,称为一次[竞 ...

  5. CF-832B

    B. Petya and Exam time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  6. 微信小程序开发之页面wxml里面实现循环 wx:for

    js代码: Page({ data:{ upploadimagelist:{},    //上报图片列表 js数组 }}) 后台数据库保存的格式:{"imageList":[{&q ...

  7. 取消IE增强的安全配置

    在window server里用ie各种信任添加很麻烦 可以通过如下方式取消IE增强设置: 如,在Server2008中,点击快速启动栏里面的服务器管理器图标,进入服务器管理器.选择配置 IE ESC ...

  8. Bootstrap表格分页(二)

    本文使用Bootstrap-table来对表格进行分页,关于Bootstrap-table以及下载插件包请点击官网:http://bootstrap-table.wenzhixin.net.cn 首先 ...

  9. 微信小程序中时间戳和日期的相互转换

    在微信开发小程序时,后台传入的诗句可能是 时间戳 而不是日期  或者需要把日期转换成时间戳来做出相应的处理时我们将用到时间戳和日期的相互转换微信小程序里, 时间戳转化为日期格式,支持自定义.拷贝至项目 ...

  10. test markdown style

    code // Forward declaration of isBadVersion API. bool isBadVersion(int version); class Solution { pu ...