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

第一种方法:利用 板卡的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 即可,以下是部分源代码:

  1. void testCardAPI()
  2. {
  3. HANDLE channelHandle ;
  4. DWORD nport;
  5.  
  6. //initialize the card
  7.  
  8. SetDefaultVideoStandard(StandardPAL); //returns 0 if error
  9.  
  10. //返回通道个数
  11. int nChannels = InitDSPs();
  12.  
  13. if( nChannels > )
  14. {
  15.  
  16. //try to open any Channel
  17. for(int i = ; i < GetTotalChannels() ; i++)
  18. {
  19. channelHandle = ChannelOpen( i );
  20. if( (unsigned int)channelHandle != 0xFFFFFFFF )
  21. {
  22. //此处有疑问,nport 不知道是什么
  23. nport = i ;
  24. break;
  25. }
  26. }
  27.  
  28. //system("pause");
  29.  
  30. // 如果 open channel 成功
  31. if( (unsigned int)channelHandle != 0xFFFFFFFF )
  32. {
  33. //注册画图回调函数
  34. //RegisterDrawFun();
  35.  
  36. SetOverlayColorKey( RGB(,,) );
  37.  
  38. //设置视频预览模式: overlay
  39. int supportOverlayFlag = SetPreviewOverlayMode( true );
  40.  
  41. if( supportOverlayFlag != )
  42. {
  43. //不支持 overlay, 就报错
  44. }
  45.  
  46. //CWnd wnd;
  47. //wnd.m_hwnd;
  48.  
  49. // StartVideoPreview( channelHandle, wnd.GetSafeHwnd() ,
  50. UCHAR imageBuf[ * * ];
  51. DWORD Size = * * ;
  52. DWORD hSize= * * ;
  53. UCHAR *imageBuffer=new UCHAR[hSize];
  54. cvNamedWindow("image",);
  55. while()
  56. {
  57. GetJpegImage(channelHandle, imageBuf, &Size, );
  58.  
  59. CvMat mat = cvMat(,,CV_8UC1, imageBuf);
  60.  
  61. IplImage *pIplImage = cvDecodeImage( &mat, );
  62.  
  63. //memcpy(imageBuffer,imageBuf,Size);
  64. //IplImage *pIplImage=cvCreateImage(cvSize(704,576),8,1);
  65. if(pIplImage)
  66. {
  67. //memcpy(pIplImage->imageData,imageBuf,Size);
  68. cvShowImage("image",pIplImage);
  69. cvReleaseImage(&pIplImage);
  70. }
  71. if(cvWaitKey()==)
  72. break;
  73. }
  74.  
  75. }
  76. }
  77. }

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

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

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

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

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

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

  1. // TestSDK.cpp : 定义控制台应用程序的入口点。
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #define _AFXDLL
  7. #include <afxwin.h>
  8.  
  9. #include "cv.h"
  10. #include "highgui.h"
  11.  
  12. #pragma comment (lib, "DS40xxSDK.lib")
  13.  
  14. #include "DataType.h"
  15. #include "HikVisionSdk.h"
  16.  
  17. void testCardAPI();
  18.  
  19. int _tmain(int argc, _TCHAR* argv[])
  20. {
  21. testCardAPI();
  22. return ;
  23. }
  24.  
  25. void testCardAPI()
  26. {
  27. HANDLE channelHandle ;
  28. DWORD nport;
  29.  
  30. //initialize the card
  31.  
  32. SetDefaultVideoStandard(StandardPAL); //returns 0 if error
  33.  
  34. //返回通道个数
  35. int nChannels = InitDSPs();
  36.  
  37. if( nChannels > )
  38. {
  39.  
  40. //try to open any Channel
  41. for(int i = ; i < GetTotalChannels() ; i++)
  42. {
  43. channelHandle = ChannelOpen( i );
  44. if( (unsigned int)channelHandle != 0xFFFFFFFF )
  45. {
  46. //此处有疑问,nport 不知道是什么
  47. nport = i ;
  48. break;
  49. }
  50. }
  51.  
  52. //system("pause");
  53.  
  54. // 如果 open channel 成功
  55. if( (unsigned int)channelHandle != 0xFFFFFFFF )
  56. {
  57. //注册画图回调函数
  58. //RegisterDrawFun();
  59.  
  60. SetOverlayColorKey( RGB(,,) );
  61.  
  62. //设置视频预览模式: overlay
  63. int supportOverlayFlag = SetPreviewOverlayMode( true );
  64.  
  65. if( supportOverlayFlag != )
  66. {
  67. //不支持 overlay, 就报错
  68. }
  69.  
  70. //CWnd wnd;
  71. //wnd.m_hwnd;
  72.  
  73. // StartVideoPreview( channelHandle, wnd.GetSafeHwnd() ,
  74. UCHAR imageBuf[ * *];
  75. DWORD Size = * *;
  76. DWORD hSize= * ;
  77. UCHAR *imageBuffer=new UCHAR[hSize];
  78. cvNamedWindow("image",);
  79. while()
  80. {
  81. GetOriginalImage(channelHandle, imageBuf, &Size);
  82. memcpy(imageBuffer,imageBuf,hSize);
  83. IplImage *pIplImage=cvCreateImage(cvSize(,),IPL_DEPTH_8U,);
  84. if(pIplImage)
  85. {
  86. memcpy(pIplImage->imageData,imageBuffer,hSize);
  87. cvShowImage("image",pIplImage);
  88. cvReleaseImage(&pIplImage);
  89. }
  90. if(cvWaitKey()==)
  91. break;
  92. }
  93.  
  94. }
  95. }
  96. }

关键之处在

  1. UCHAR imageBuf[ * *];
  2. DWORD Size = * *;
  3. DWORD hSize= * ;
  4. UCHAR *imageBuffer=new UCHAR[hSize];
  5. cvNamedWindow("image",);
  6. while()
  7. {
  8. GetOriginalImage(channelHandle, imageBuf, &Size);
  9. memcpy(imageBuffer,imageBuf,hSize);
  10. IplImage *pIplImage=cvCreateImage(cvSize(,),IPL_DEPTH_8U,);
  11. if(pIplImage)
  12. {
  13. memcpy(pIplImage->imageData,imageBuffer,hSize);
  14. cvShowImage("image",pIplImage);
  15. cvReleaseImage(&pIplImage);
  16. }
  17. if(cvWaitKey()==)
  18. break;
  19. }

海康威视采集卡结合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. ubuntu16.04 NVIDIA 驱动安装

    查看驱动版本号 查看驱动适用版本:NVIDIA驱动版本查询 查看显卡对应的驱动版本: 举例如下: 禁止集成的nouveau驱动 Ubuntu系统集成的显卡驱动程序是nouveau,它是第三方为NVID ...

  2. SPOJ(后缀数组求不同子串个数)

    DISUBSTR - Distinct Substrings Given a string, we need to find the total number of its distinct subs ...

  3. CSS:CSS 选择器参考手册

    ylbtech-CSS:CSS 选择器参考手册 1.返回顶部 1. 我们会定期对 W3School 的 CSS 参考手册进行浏览器测试. CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需 ...

  4. keil5中文乱码的解决

    keil5 复制出来的中文显示乱码,该如何解决? 点击Edit - Configuration ,进入编辑器设置: 点击ok ,就可以了

  5. Python_列表,元组和字典的异同

    1,列表:list 可变的数据类型,可以被改变,可以进行嵌套处理,可在一个列表中存储一个序列的项目 指明一个列表的方法是:使用方括号 代码示例: >>> fruit_list = [ ...

  6. (转)data Table的用法大全

    jqyery dataTable 基本用法 一:官方网站:[http://www.datatables.net/] 二:基本使用:[http://www.guoxk.com/node/jquery-d ...

  7. dataTables使用ajax请求显示数据

    dataTables是一种很好用前端表格显示库.当加载大量数据时,可以用Ajax 获取数据来提高效率,增速网页加载速率.下面以一个例子作示范. 首先,需要下载jQuery以及dataTables库.这 ...

  8. php破解防盗链技术

    php破解防盗链技术 发送http请求 构造referer信息 在Http协议中,头信息里,有一个重要的选项: Referer Referer: 代表网页的来源,即上一页的地址 具体方法http.cl ...

  9. JSON 下 -- jansson 示例

    JSON 下 —— jansson 示例 参考网址: jansson 库的下载: http://www.digip.org/jansson/ 安装jansson 步骤: http://blog.csd ...

  10. PTA 4-4 先序输出叶结点 【基础题】

    //二叉树的叶结点:度为0的结点. void PreorderPrintLeaves( BinTree BT ) { if(BT==NULL) //如果传下来根节点就是空,直接返回: return; ...