1. <span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h></span>
  1. #include <cv.h>
  2. #include <cxcore.h>
  3. #include <highgui.h>
  4.  
  5. int main( int argc, char** argv )
  6. {
  7. //声明IplImage指针
  8. IplImage* pFrame = NULL;
  9. IplImage* pFrImg = NULL;
  10. IplImage* pBkImg = NULL;
  11.  
  12. CvMat* pFrameMat = NULL;
  13. CvMat* pFrMat = NULL;
  14. CvMat* pBkMat = NULL;
  15.  
  16. CvCapture* pCapture = NULL;
  17. //
  18.  
  19. int nFrmNum = 0;
  20.  
  21. //创建窗体
  22. cvNamedWindow("video", 1);
  23. cvNamedWindow("background",1);
  24. cvNamedWindow("foreground",1);
  25. //使窗体有序排列
  26. cvMoveWindow("video", 30, 0);
  27. cvMoveWindow("background", 360, 0);
  28. cvMoveWindow("foreground", 690, 0);
  29.  
  30. if( argc > 2 )
  31. {
  32. fprintf(stderr, "Usage: bkgrd [video_file_name]\n");
  33. return -1;
  34. }
  35.  
  36. //打开摄像头
  37. if (argc ==1)
  38. if( !(pCapture = cvCaptureFromCAM(0)))
  39. {
  40. fprintf(stderr, "Can not open camera.\n");
  41. return -2;
  42. }
  43.  
  44. //打开视频文件
  45. if(argc == 2)
  46. if( !(pCapture = cvCaptureFromFile(argv[1])))
  47. {
  48. fprintf(stderr, "Can not open video file %s\n", argv[1]);
  49. return -2;
  50. }
  51.  
  52. //逐帧读取视频
  53. while(pFrame = cvQueryFrame( pCapture ))
  54. {
  55. nFrmNum++;
  56.  
  57. //假设是第一帧。须要申请内存。并初始化
  58. if(nFrmNum == 1)
  59. {
  60. pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
  61. pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
  62.  
  63. pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  64. pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  65. pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  66.  
  67. //转化成单通道图像再处理
  68. cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
  69. cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
  70.  
  71. cvConvert(pFrImg, pFrameMat);
  72. cvConvert(pFrImg, pFrMat);
  73. cvConvert(pFrImg, pBkMat);
  74. }
  75. else
  76. {
  77. cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
  78. cvConvert(pFrImg, pFrameMat);
  79. //高斯滤波先,以平滑图像
  80. //cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);
  81.  
  82. //当前帧跟背景图相减
  83. cvAbsDiff(pFrameMat, pBkMat, pFrMat);
  84.  
  85. //二值化前景图
  86. cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);
  87.  
  88. //进行形态学滤波,去掉噪音
  89. //cvErode(pFrImg, pFrImg, 0, 1);
  90. //cvDilate(pFrImg, pFrImg, 0, 1);
  91.  
  92. //更新背景
  93. cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);
  94. //将背景转化为图像格式。用以显示
  95. cvConvert(pBkMat, pBkImg);
  96.  
  97. //显示图像
  98. cvShowImage("video", pFrame);
  99. cvShowImage("background", pBkImg);
  100. cvShowImage("foreground", pFrImg);
  101.  
  102. //假设有按键事件,则跳出循环
  103. //此等待也为cvShowImage函数提供时间完毕显示
  104. //等待时间能够依据CPU速度调整
  105. if( cvWaitKey(2) >= 0 )
  106. break;
  107.  
  108. }
  109.  
  110. }
  111.  
  112. //销毁窗体
  113. cvDestroyWindow("video");
  114. cvDestroyWindow("background");
  115. cvDestroyWindow("foreground");
  116.  
  117. //释放图像和矩阵
  118. cvReleaseImage(&pFrImg);
  119. cvReleaseImage(&pBkImg);
  120.  
  121. cvReleaseMat(&pFrameMat);
  122. cvReleaseMat(&pFrMat);
  123. cvReleaseMat(&pBkMat);
  124. cvReleaseCapture(&pCapture);
  125.  
  126. return 0;
  127. }

还是那段代码。昨天弄懂了main函数參数表中argcHe argv 的含义,假设直接编译执行的话相当于在命令行输入try.exe ,即argc为1。

转到命令行执行

结果

结果让选择视频源。点击确定之后就直接秒退了。查阅开发文档资料得知 cvCreateCameraCapture(int index) 函数能够选择摄像头,但实际測试发现 cvCaptureFromCAM仅仅接受 –1 和 0 两种參数,然后就把-1改动成了0,结果能够正常打开摄像头了

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hhb3NoZW55dXRvdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

详细原因我也没有搞清楚,查了Opencv的官方文档:

OpenCV中一个函数。初始化从摄像头中获取视频
CvCapture*cvCaptureFromCAM( int index );
  • index
  • 要使用的摄像头索引。

    假设仅仅有一个摄像头或者用哪个摄像头也无所谓,那使用參数-1应该便能够。

函数给从摄像头的视频流分配和初始化CvCapture结构。眼下在Windows下可使用两种接口:Video forWindows(VFW)和Matrox Imaging Library(MIL);Linux下也有两种接口:V4L和FireWire(IEEE1394)。

也没有说的非常具体。问题有待研究..

另外要说的一点是,假设要打开要处理的视频文件。最简单把avi视频放在exe文件同样文件夹下。在命令行输入如 try2.exe 123.avi就可以。

OpenCV打开摄像头失败的更多相关文章

  1. opencvbase 实现opencv打开摄像头和初步处理等效果操作(附源码)

    // TwoCameraOnTimer2Dlg.cpp : 实现文件 /* CvMat, Mat, IplImage之间的互相转换 IpIImage -> CvMat CvMat mathead ...

  2. 如何使用 OpenCV 打开摄像头获取图像数据?

    OpenCV 如何打开摄像头获取图像数据? 代码运行环境:Qt 5.9.1 msvc2015 32bit OpenCV 3.3.0 #include "include/opencv2/ope ...

  3. opencv打开摄像头获取视频程序

    // // main.cpp // opencv3 // // Created by PKU on 14-9-16. // Copyright (c) 2014年 PKU. All rights re ...

  4. opencv 打开摄像头(c++)

    1,打开视频文件 2,打开IP摄像头 读取大华摄像头 大华的网络摄像头编号:DH-IPC-HFW1225M-I1-0600B,用的是RTSP协议. "rtsp://admin:dahua@1 ...

  5. ubantu打开摄像头失败

    摘要-针对ubantu20 sudo apt install v4l-utils v4l2-ctl --list-devices - cv2 install on ubantu20```针对ubant ...

  6. opencv打开摄像头并新建窗口显示

    几个程序使用的基本函数如下: ******************************************************************* cvCreateCameraCap ...

  7. Opencv打开摄像头,读不到图像,一般来说先读取第一帧,舍弃,然后就正常了

    舍弃第一帧的程序: cap >> img; cv::waitKey(100);  if (cvWaitKey(5) == 27) break; cap >> img;

  8. 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  9. 基于opencv网络摄像头在ubuntu下的视频获取

     基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参 ...

随机推荐

  1. c#调用带有自定义表结构的存储过程

    1.新建自定义表结构 CREATE TYPE [dbo].[HBForHBGHDR] AS TABLE( [序号] [int] NULL, [客户编号] [varchar](15) NULL ) GO ...

  2. POJ 2286 The Rotation Game IDA*

    (再一次感谢学长幻灯片) ID A* 随便自己yy了一下. 额嗯 思路什么的都没有问题 就是改不对.. 无奈地删代码...边删边交. 删啊删 哎呦 AC了 ... ... ... 找删的那一段 . o ...

  3. Php.ini文件位置在哪里 Php.ini文件找不到

    转载自:http://www.php100.com/html/php/rumen/2013/0831/26.html [导读] Php ini文件是php的一个配置文件,在windows主机中如果你未 ...

  4. PHP序列化 反序列化

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 1. serialize和 ...

  5. reduce多种方法计算数组中某个值的出现次数

    先来了解下reduce用法 arr.reduce(callback[, initialValue]) callback执行数组中每个值的函数,包含四个参数: accumulator 累计器累计回调的返 ...

  6. HIVE 命令记录

    HIVE 命令记录 设置hive运行的队列 hive> set mapreduce.job.queuename=ven12; 打印列名 hive> set hive.cli.print.h ...

  7. dubbo之直连提供者

    在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获 ...

  8. 题解 P3258 【[JLOI2014]松鼠的新家】(From luoguBlog)

    唯一能得分的题也被自己搞炸了,好的. 考场上读完题基本认定和lca脱不了干系,想了一会确认是树剖. 那么问题来了,考前一节课刚发现自己之前打的树剖是错的. 而且就算是错的我也没信心考场调出来. 于是打 ...

  9. javascrip this指向问题深入理解

    在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余. 1. 一般用处 对 ...

  10. BZOJ 3319: 黑白树 树+并查集+未调完+神题

    Code: #include<bits/stdc++.h> #define maxn 1000003 using namespace std; char *p1,*p2,buf[10000 ...