海康威视采集卡结合opencv使用(两种方法)-转
(注:第一种方法是我的原创 ^_^。 第二种方法是从网上学习的。)
第一种方法:利用 板卡的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使用(两种方法)-转的更多相关文章
- php如何防止图片盗用/盗链的两种方法
如今的互联网,采集网站非常多,很多网站都喜欢盗链/盗用别人网站的图片,这样不仅侵犯网权,还导致被盗链的网站消耗大量的流量,给服务器造成比较大的压力,本文章向大家介绍php如何防止图片盗用/盗链的两种方 ...
- MyEclipse取消验证Js的两种方法
MyEclipse取消验证Js的两种方法 作者: 字体:[增加 减小] 类型:转载 通过js写一个web工程的相关页面时感觉很卡,修改内存也不行下面有两种解决方法,大家可以尝试下 前言:有时我们通过j ...
- 相机标定 matlab opencv ROS三种方法标定步骤(1)
一 . 理解摄像机模型,网上有很多讲解的十分详细,在这里我只是记录我的整合出来的资料和我的部分理解 计算机视觉领域中常见的三个坐标系:图像坐标系,相机坐标系,世界坐标系,实际上就是要用矩阵来表 示各个 ...
- Python3求笛卡尔积的两种方法
[本文出自天外归云的博客园] 电影异次元杀阵三部曲中密室线索反复出现笛卡尔积的运用.百度百科: 笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为 ...
- 智能手机的耗电特征及APP耗电量测试的两种方法
文章陈述了手机发展趋势及耗电特性,集中讨论了时下最为关心的智能手机耗电问题,并介绍了测量手机软件耗电量的两种方法.此外还解释了为何运营商此前会提出收取微信的费用,心跳机制是什么. 美国著名手机公司Pa ...
- Wireshark解密HTTPS流量的两种方法
原理 我们先回顾一下SSL/TLS的整个握手过程: Clienthello:发送客户端的功能和首选项给服务器,在连接建立后,当希望重协商.或者响应服务器的重协商请求时会发送. version:客户端支 ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- android 之 启动画面的两种方法
现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...
- [转载]C#读写txt文件的两种方法介绍
C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...
随机推荐
- ubuntu16.04 NVIDIA 驱动安装
查看驱动版本号 查看驱动适用版本:NVIDIA驱动版本查询 查看显卡对应的驱动版本: 举例如下: 禁止集成的nouveau驱动 Ubuntu系统集成的显卡驱动程序是nouveau,它是第三方为NVID ...
- SPOJ(后缀数组求不同子串个数)
DISUBSTR - Distinct Substrings Given a string, we need to find the total number of its distinct subs ...
- CSS:CSS 选择器参考手册
ylbtech-CSS:CSS 选择器参考手册 1.返回顶部 1. 我们会定期对 W3School 的 CSS 参考手册进行浏览器测试. CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需 ...
- keil5中文乱码的解决
keil5 复制出来的中文显示乱码,该如何解决? 点击Edit - Configuration ,进入编辑器设置: 点击ok ,就可以了
- Python_列表,元组和字典的异同
1,列表:list 可变的数据类型,可以被改变,可以进行嵌套处理,可在一个列表中存储一个序列的项目 指明一个列表的方法是:使用方括号 代码示例: >>> fruit_list = [ ...
- (转)data Table的用法大全
jqyery dataTable 基本用法 一:官方网站:[http://www.datatables.net/] 二:基本使用:[http://www.guoxk.com/node/jquery-d ...
- dataTables使用ajax请求显示数据
dataTables是一种很好用前端表格显示库.当加载大量数据时,可以用Ajax 获取数据来提高效率,增速网页加载速率.下面以一个例子作示范. 首先,需要下载jQuery以及dataTables库.这 ...
- php破解防盗链技术
php破解防盗链技术 发送http请求 构造referer信息 在Http协议中,头信息里,有一个重要的选项: Referer Referer: 代表网页的来源,即上一页的地址 具体方法http.cl ...
- JSON 下 -- jansson 示例
JSON 下 —— jansson 示例 参考网址: jansson 库的下载: http://www.digip.org/jansson/ 安装jansson 步骤: http://blog.csd ...
- PTA 4-4 先序输出叶结点 【基础题】
//二叉树的叶结点:度为0的结点. void PreorderPrintLeaves( BinTree BT ) { if(BT==NULL) //如果传下来根节点就是空,直接返回: return; ...