前言

Windows下实现摄像视频捕捉有多种实现方式;各种方式的优劣,本文不做对比。但是,opencv是一款老牌开发库,在图像处理领域声名显赫。采用opencv来处理摄像视频,在性能和稳定性上,是有保障的。并且,opencv包含很多图像处理函数,可以更方便的对视频处理。

执行程序是用wpf开发的,所以先将opencv封装成c语言接口,以供调用。opencv也不可能提供现成的控件供wpf使用,两种不同的开发语言“沟通”起来有些困难。其实稍作变通,就可以实现摄像头播放功能。

1 对opencv封装

opencv的类VideoCapture封装了对摄像头的操作,使用起来也非常简单。

bool open(int device); device为摄像头设备序号。

如果有多个摄像头,怎么知道哪个摄像头的序号那?可以通过如下函数,获取摄像头列表。摄像头在list中索引即为设备序号。

int GetCameraDevices(vector& list)

{

ICreateDevEnum *pDevEnum = NULL;

IEnumMoniker *pEnum = NULL;

int deviceCounter = 0;

CoInitialize(NULL);

HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,

CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,

reinterpret_cast(&pDevEnum));

if (SUCCEEDED(hr))

{

// Create an enumerator for the video capture category.

hr = pDevEnum->CreateClassEnumerator(

CLSID_VideoInputDeviceCategory,

&pEnum, 0);

if (hr == S_OK) {

//if (!silent)printf("SETUP: Looking For Capture Devices\n");

IMoniker *pMoniker = NULL;

while (pEnum->Next(1, &pMoniker, NULL) == S_OK) {

IPropertyBag *pPropBag;

hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,

(void**)(&pPropBag));

if (FAILED(hr)) {

pMoniker->Release();

continue; // Skip this one, maybe the next one will work.

}

// Find the description or friendly name.

VARIANT varName;

VariantInit(&varName);

hr = pPropBag->Read(L"Description", &varName, 0);

if (FAILED(hr))

hr = pPropBag->Read(L"FriendlyName", &varName, 0);

if (SUCCEEDED(hr)) {

hr = pPropBag->Read(L"FriendlyName", &varName, 0);

int count = 0;

wstring str2 = varName.bstrVal;

list.push_back(str2);

}

pPropBag->Release();

pPropBag = NULL;

pMoniker->Release();

pMoniker = NULL;

deviceCounter++;

}

pDevEnum->Release();

pDevEnum = NULL;

pEnum->Release();

pEnum = NULL;

}

}

return deviceCounter;

}

总之,使用opencv打开摄像头非常简单。

打开之后,就是获取摄像头图像。视频其实就是图像的集合;每秒钟获取25幅图像,将其在控件上显示,就是视频。

Mat cameraImg;

_pCapture >> cameraImg;

Mat类封装了对图像的操作。c#不可能操作Mat,需要将Mat中纯图像部分数据传递出来,图像才能被c#利用。

int Camera_GetImgData(INT64 handle, char* imgBuffer)

{

CameraInfo *pCameraInfo = (CameraInfo*)handle;

Mat cameraImg;

*(pCameraInfo->_pCapture) >> cameraImg;

if (!cameraImg.empty())

{

int height = cameraImg.rows;int dataLen = height * cameraImg.step;

memcpy(imgBuffer, cameraImg.data, dataLen);

return 0;

}

else

{

return 1;

}

}

cameraImg.data中存有图像数据,data的大小可以根据图像的高度、每行图像的步幅计算出来。c#调用此函数后,imgBuffer存放图像数据。对数据imgBuffer处理后,就可以在控件上显示。

c语言对opencv封装函数列表如下:

extern "C"

{

OpenCVCamera_API int Camera_GetCameraName(char* listName);

OpenCVCamera_API INT64 Camera_CreateHandle();

OpenCVCamera_API void Camera_CloseHandle(INT64 handle);

OpenCVCamera_API BOOL Camera_IsOpen(INT64 handle);

OpenCVCamera_API int Camera_Open(INT64 handle, int index);

OpenCVCamera_API int Camera_Close(INT64 handle);

OpenCVCamera_API int Camera_GetImgInfo(INT64 handle,int& width,int& height,int& channel,

int& step, int& depth);

OpenCVCamera_API int Camera_GetImgData(INT64 handle, char* imgBuffer);

//flipCode >0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转

OpenCVCamera_API int Camera_GetImgData_Flip(INT64 handle, char* imgBuffer, int flipCode);

OpenCVCamera_API int Camera_ImgData_Compress(int rows, int cols, int type, void* imgBuffer,

int param,void* destBuffer,int* destLen);

}

2 WPF实现视频播放

WPF的Image控件实现图像的显示。实现视频播放的逻辑为:设定一个定时器(时间间隔为40毫秒),每隔一段时间从opencv获取图像,在控件中显示。

实现图像显示代码

BitmapSource bitmapSource = _openCVCamera.GetBitmapSource();

if (bitmapSource == null)

return false;

imageVideoPlayer.Source = bitmapSource;

实现图像显示的关键是构建BitmapSource,暨:如何从opencv中获取图像数据构建BitmapSource。

//获取图像数据

if (!GetImgData(out byte[] imgData))

return null;

//构建WriteableBitmap

WriteableBitmap img = new WriteableBitmap(_imgWidth, _imgHeight, 96, 96, PixelFormats.Bgr24, null);

img.WritePixels(new Int32Rect(0, 0, _imgWidth, _imgHeight),

imgData, img.BackBufferStride, 0);

img.Freeze();

至此,就可以显示摄像头图像了。

以上就是c#基于opencv,开发摄像头播放程序的详细内容,更多关于c# opencv摄像头播放的资料请关注脚本之家其它相关文章!

软件c#语言调用摄像头,c#基于opencv,开发摄像头播放程序相关推荐

  1. html5摄像头手势识别,基于OpenCV的摄像头动态手势轨迹识别及其应用

    [实例简介] 基于OpenCV的摄像头动态手势轨迹识别及其应用,前沿的研究,最新论文 2012 B_0% random t Xo X,XX 4_1.42.B0 Bhattacharyya glsl. ...

  2. 基于OpenCV的摄像头人脸检测

    一.选题背景 二.设计目的和意义 三.设计方案 四.特征分类器的选择 4.1 常用人脸检测的特征分类器 4.2 人脸的Haar特征分类器介绍 4.3 人脸的Haar特征分类器使用 五.设计中主要函数介 ...

  3. 基于OpenCV的摄像头测距(2022-1-1)

    基于OpenCV的摄像头测距 前言 去年暑假参加了一个比赛,比赛内容中需要确定目标的位置 本来想全用图像完成的,最后发现不是很符合要求.比完赛之后,就忙别的事了.直到现在突然想试试摄像头测距.就来了 ...

  4. 基于opencv在摄像头ubuntu根据视频获取

     基于opencv在摄像头ubuntu根据视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译执行步骤 安装编译opencv-2.3  參考h ...

  5. 基于avaSwing开发普通计算器程序 课程设计 大作业源码

    基于avaSwing开发普通计算器程序:   (大作业) 开发环境: Windows操作系统 开发工具: MyEclipse+Jdk 运行效果图: 基于avaSwing开发普通计算器程序:   (大作 ...

  6. 调用笔记本的摄像头实现基于opencv的视频人脸识别(中文显示和英文显示)以及 index 480 is out of bounds for axis 0 with size 480错误的解决

    @人脸识别代码和一些常见错误 基于opencv的视频人脸识别(中文显示)以及 index 480 is out of bounds for axis 0 with size 480错误的解决 参考了 ...

  7. python获取摄像头型号_python opencv设置摄像头分辨率以及各个参数的方法_python

    下面就为大家分享一篇python opencv设置摄像头分辨率以及各个参数的方法,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 1,为了获取视频,你应该创建一个 VideoCapture 对 ...

  8. python开发的著名软件公司_软件开发公司_软件外包_项目外包平台基于Python开发一个全文检索系统...

    基于Python开发一个全文检索系统.功能要求为: 使用全文检索引擎对文本进行检索.文本的格式为Word.PDF.TXT. 同时按数据域进行复合条件检索.数据域指文本对应的信息,例如创建人.文件编号. ...

  9. 利用HFS软件一分钟搭建好ESP8266基于Arduino开发环境

    利用HFS一分钟搭建好ESP8266基于Arduino开发环境

最新文章

  1. 解决关于 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it....报错
  2. 有关nginx upstream的几种配置方式
  3. 用信号量锁定:一个例子
  4. Grails 基础环境搭建及HelloWorld
  5. 微软Windows Hello曝漏洞!外接一个USB摄像头,分分钟破解你的电脑
  6. 本地运行 MAYA 帮助文档
  7. 海洋地球物理设备简述—海洋磁力仪和地磁日变站
  8. 段码液晶屏实现原理和需要注意的事项
  9. 【中科三方】什么是云解析DNS?云解析DNS有必要购买吗?
  10. C++Error2208:...尝试引用已删除的函数
  11. Oracle PL/SQL 编程手册(SQL大全)
  12. OpenWrt固件实现路由器定时重启方法
  13. python中,Microsoft Visual C++ 14.0 or greater is required问题解决方案
  14. 【_ 記 】各类邮箱POP3和SMTP服务器地址和端口
  15. 易编远航程序防封防检测方法
  16. mastercam后处理升级_MastercamX9,2017,2018,2019,2020各版本后处理(功能全面)2019-11-23更新...
  17. CentOS7中使用yum安装php5.6的方法
  18. 使用继电器和Arduino开发板控制高压电路
  19. AcWing417. 不高兴的津津
  20. 《社会调查数据管理——基于Stata 14管理CGSS数据》一2.2 数据管理的工作标准...

热门文章

  1. c语言汉字属于什么类型_设计源于传承 |为什么字体设计太难?独属于我们的汉字—甲骨文...
  2. Python进程间通信
  3. 树莓派设置wifi自动连接
  4. request 和require区别_「猫咪词汇」语音讲解 suggest /advise /request/ require辨析
  5. 机器人技术课堂笔记-zjj2016.11.10
  6. mysql5.7.14安装版教程_MySQL5.7.14-下载安装教程--gt;MySQL数据库语句详细教程
  7. 不需要口才和颜值,用手机就能做,分享35款自媒体工具,每天300很简单
  8. 自然语言处理从入门到应用——自然语言处理的语言模型(Language Model,LM)
  9. Python的内存管理与垃圾回收机制
  10. \t\t怎样去除人身体内的湿气?