海康威视采集卡结合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 ...
随机推荐
- 如何在Flask的构架中传递logger给子模块
Logger的传递 作为一个新手,如何将主函数的logger传入子模块是一件棘手的事情.某些情况下可以直接将logger作为参数传入子模块的构造函数中,但倘若子模块与主模块存在相互依赖的关系则容易出现 ...
- ARM版本系列及家族成员梳理
ARM公司简介 ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能.廉价.耗能低的RISC (精简指令集)处理器. 1985年第一个AR ...
- poll的使用
#define POLL_FD_SIZE 1024 int doServicePoll(int listenFd) { struct sockaddr_in cliAddr; socklen_t le ...
- Ubuntu 安装indicator-sysmonitor
之前就像安装一个软件用来查看Ubuntu的CPU, 内存, 网速情况, 终于让我碰到了--indicator-sysmonitor 仅需三条命令, 你值得拥有: sudo add-apt-reposi ...
- SublimeLinter js和css的语法检查
JavaScript 语法检查 SublimeLinter-jshint 是基于 nodeJS 下的 jshint 的插件,实际上 SublimeLinter-jshint 调用了 nodeJS 中 ...
- JQuery扩展插件Validate—5添加自定义验证方法
从前面的示例中不难看出validate中自带的验证方法足以满足一般的要求,对于特别的要求可以使用addMethod(name,method,message)添加自定义的验证规则,下面的示例中添加了一个 ...
- sort()的升降序函数操作
sort()函数包含在头文件#include <algorithm>中,是常用的排序函数. functional提供了一堆基于模板的比较函数对象.它们是:equal_to<Type& ...
- TypeScript完全解读(26课时)_1.TypeScript完全解读-开发环境搭建
1.TypeScript完全解读-开发环境搭建 初始化项目 手动创建文件夹 D:\MyDemos\tsDemo\client-demo 用VSCode打开 npm init:初始化项目 然后我们的项目 ...
- ASP.NET Core MVC 2.x 全面教程_汇总贴
Reshaper快捷键盘 快速生成属性:prop Ctrl+. ASP.NET Core MVC 2.x 全面教程:https://www.bilibili.com/video/av38392956 ...
- SPOJ CIRU The area of the union of circles (计算几何)
题意:求 m 个圆的并的面积. 析:就是一个板子题,还有要注意圆的半径为0的情况. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024 ...