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

第一种方法:利用 板卡的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. python程序的pypy加速

    我们知道,python作为一种几乎是脚本语言的语言,其优点固然有,但是其有一个最大的缺点,就是运行速度没有办法和c,c++,java比.最近在些一些代码的时候也是碰到了这样的问题. 具体而言,pyth ...

  2. py-day17-jquery

    jquery实现案例 案例: 1.点赞 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  3. Ubuntu 安装mysql和 简单命令操作

    ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server   2. apt-get isntall mysql-clie ...

  4. 十、外键约束FK(foreign key)

    1.定义 a.外键涉及到的术语:外键约束.外键字段.外键值. b.外键约束.外键字段.外键值三者之间的关系? 答:给某个字段添加外键约束之后,该字段称为外键字段,外键字段中的值是外键值. c.外键根据 ...

  5. shell脚本 列出所有网卡的ip地址

    #!/bin/bashfor i in `ifconfig | grep -o ^[a-z0-9]*`do ifconfig $i|sed -n 2p|awk '{ print $2 }'|tr -d ...

  6. Flutter实战视频-移动电商-15.首页_商品推荐模块编写

    15.首页_商品推荐模块编写 商品推荐,我们做成可以横向滚动的 分析: 上面是标题,下面是ListView,里面是一个Column, column分三层,第一是图片,第二是价格,第三是市场价格 小细节 ...

  7. 2-2和2-3基本数据类型 & 2-4基本数据类型详解 & 3-1和3-2整形字面量值及变量声

    2-4基本数据类型详解 3-1和3-2整形字面量值及变量声 023是八进制的 0x1357是十六进制 0X3C也是十六进制 0x1abL:长整型 变量声明 数据类型 空格 变量名 赋值: 变量的定义:

  8. Subresource Integrity(子资源一致性)和JS DDos 攻击

    以下文章转载自 http://www.cnblogs.com/zoucaitou/p/4505483.html 和 http://www.puronglong.com/blog//2015/04/12 ...

  9. DOM学习笔记(三)DOM元素的访问、修改与事件

    访问 HTML 元素等同于访问节点,使用的是document对象下的数个getElement方法,然后再对返回的元素(或元素列表)进行具体内容的访问和修改,或者响应对应的事件是操作 一些 DOM 对象 ...

  10. UICollctionView 刷新 item 刷新 消失

    在需要局部刷新的时候,可能出现的问题: 当时采用的局部刷新,第一次刷新没问题,当多次刷新的时候 item 就会消失 NSIndexSet *]; [collectionView reloadSecti ...