win7系统下使用openCV调用摄像头问题

鄙人今日尝试使用openCV调用摄像头做图片中圆的圆心位置检测时,意外发现程序能成功调用笔记的集成摄像头,但却无法调用外接的USB摄像头。(使用的为OpenCV1.0 + VC6.0)

使用程序如下:

#include"cv.h"
#include"highgui.h"
#include"cvcam.h"
#include"iostream"
using namespace std;

int main(int argc,char* argv[])
{
CvCapture* cap;
cap=cvCaptureFromCAM(0);
//cap=cvCreateCameraCapture(1);      //使用该函数与上面函数效果一样
if(!cap)
{
cout<<"create camera capture error"<<endl;
system("pause");
exit(-1);
}
cvNamedWindow("example",1);
IplImage* img;

//sleep(2000);

while(1)
{
img=cvQueryFrame(cap);//捕获相机的视频帧,并进行解码操作
// img=cvLoadImage("F:\\360云盘\\图片\\20083281447418_2.jpg"); //直接读取图片
if(!img)
break;
if(img->origin==IPL_ORIGIN_TL)//如果图片原点在左上角,将其沿X轴翻转,使左下角
{
cvFlip(img,img);
}
cvShowImage("example",img);
cvWaitKey(30);

IplImage*gray =cvCreateImage( cvGetSize(img),8,1);
CvMemStorage*storage = cvCreateMemStorage(0);
cvCvtColor(img,gray,CV_BGR2GRAY);
cvSmooth(gray,gray,CV_GAUSSIAN,5,15);

CvSeq*circles = cvHoughCircles(gray,storage,CV_HOUGH_GRADIENT,2,gray->height/4,200,100);
int i;
for (i=0; i< circles->total; i++)
{
float*p = (float*)cvGetSeqElem(circles,i);

cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])),3, CV_RGB(0,255,0), -1, 8, 0);
cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0);
cout<<"圆心坐标x="<<cvRound(p[0])<<endl<<"圆心坐标y= "<<cvRound(p[1])<<endl;
cout<<"半径="<<cvRound(p[2])<<endl;
}
cout<<"圆数量= "<<circles->total<<endl;
cvWaitKey(10);
}
cvReleaseCapture(&cap);
cvDestroyAllWindows();
cvReleaseImage(&img);
return 0;
}

关于程序中函数cap=cvCaptureFromCAM(0) 的参数,有人认为设置为0时调用的是集成摄像头,设置为1的时候调用的是USB摄像头,只有一个摄像头时则设置为-1;

但在本机上实验时发现,设置为0和-1时均调用的是集成摄像头,而设置为1时则显示调用错误“create camera capture error”;

目前解决办法主要有两条

1、采用VS2010 + OpenCV2.3.1的配置显示可以调用USB摄像头,成功时出现Support SSE4.3的字符串。

另外网上有人提出可能是使用的是win7的原因不支持OpenCV1.0,改为采用XP系统能解决该问题。但本人在xp系统上尝试却是不成功的,说明系统兼容性并不是问题的根本。   分析更有可能是之前openCV低版本无法支撑高版本的USB摄像头。

2、采用DirectShow可以直接在win7 + VC6.0 + OpenCV1.0上显示USB摄像头,

使用程序如下:

#include "cxcore.h"
#include "cvcam.h"
#include "windows.h"
#include "cv.h"
#include "highgui.h"
#include "iostream"
using namespace std;

IplImage* image;
void callback(IplImage* image);
int main()
{
int ncams = cvcamGetCamerasCount( );//返回可以访问的摄像头数目
int width=640;
int height=480;

HWND MyWin;
// 设置系统属性

cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); //Enable视讯
//0:欲设置属性的摄像头序号; 第二个参数是属性名字;
//第三个参数是指向设置值的指针

cvcamSetProperty(0, CVCAM_PROP_RENDER, CVCAMTRUE); //启用视讯

// MyWin 是窗口 HWND 的类型

MyWin = (HWND) cvGetWindowHandle("cvcam window");
cvcamSetProperty(0, CVCAM_PROP_WINDOW, &MyWin); // Selects a window

cvcamSetProperty(0,CVCAM_RNDWIDTH,&width);
cvcamSetProperty(0,CVCAM_RNDHEIGHT,&height);
//video rendering

//回调函数将处理每一帧
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback);

cvcamInit( );
cvcamStart( );
IplImage*gray =cvCreateImage( cvGetSize(image),8,1);
CvMemStorage*storage = cvCreateMemStorage(0);
cvCvtColor(image,gray,CV_BGR2GRAY);
cvSmooth(gray,gray,CV_GAUSSIAN,5,15);

CvSeq*circles = cvHoughCircles(gray,storage,CV_HOUGH_GRADIENT,2,gray->height/4,200,100);
int i;
for (i=0; i< circles->total; i++)
{
float*p = (float*)cvGetSeqElem(circles,i);

cvCircle(image, cvPoint(cvRound(p[0]),cvRound(p[1])),3, CV_RGB(0,255,0), -1, 8, 0);
cvCircle(image, cvPoint(cvRound(p[0]),cvRound(p[1])),cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0);
cout<<"圆心坐标x="<<cvRound(p[0])<<endl<<"圆心坐标y= "<<cvRound(p[1])<<endl;
cout<<"半径="<<cvRound(p[2])<<endl;
}
cout<<"圆数量= "<<circles->total<<endl;
cvWaitKey(100);
// 现在程序开始工作
cvWaitKey(0);
cvcamStop( );
cvcamExit( );
return 0;
}

// 回调函数
void callback(IplImage* image)
{
cvcamPause();
cvcamGetProperty(0,"raw_image",&image);
cvcamResume();
}

但是上段程序中摄像头每帧图像的地址还不清楚是不是*image,故目前仍然没有将圆心位置检测的程序段加入进去。

DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包,与DirectX开发包一起发布。而OpenCV是一个计算机视觉的处理库,被广泛应用到各种计算机视觉的研究和应用当中。OpenCV可以利用DirectShow来采集摄像头视频,这比采用OpenCV里的采集视频数据函数要好用。这是我个人的看法。

时间: 2024-10-05 11:27:34

win7系统下使用openCV调用摄像头问题的相关文章

Win7系统下OGEngine环境搭建

OGEngine_环境搭建 前言 OGEngine开源引擎是一款开源免费.简单易学.高效实用的android游戏引擎,适用于不同层次不同专业的人员,降低广大用户在android平台上开发游戏的门槛.引擎可用于完整开发游戏框架,并提供了很多快捷.高性能的内存管理技术,同时支持第3方jar包接入,有无限的扩展性. 搭建WIN7系统开发环境 1.下载JDK,JDK8在windows xp下安装有点问题,所以在WIN7下安装.WIN7操作系统有32位和64位,分别要下载对应的JDK8版本 32位:jdk

在Win7系统下为VS2010安装和配置OpenCV2.1

由于要重新开发一个机遇OpenCV2.1的程序,因此需要在Win7系统下为VS2010安装和配置OpenCV2.1.网上找了几个教程都不能正确配置,最后找到一篇英文安装的帖子,简单明了实现了配置.为了方便自己日后查看以及其他人的可能的需要,现在将配置过程记录下来. 原帖请见:http://opencv-srf.blogspot.it/2011/09/getting-started-with-opencv_16.html Installing & Configuring OpenCV2.1 wit

Win7系统下搭建NFS服务器

Win7系统下搭建NFS服务器 采用Linux系统的服务器管理员都知道linux系统中能用NFS网络文件系统这套程序实现linux和unix系统之间的文件共享.那么能否在windows系统中采用NFS功能实现文件共享,让Linux系统来访问呢?答案是可以实现.但是必须在windows系统中安装一个实现NFS功能的第3方软件haneWin.本文在win7旗舰版系统中安装和配置NFS软件.然后在win7.Linux的客户端挂载我电脑共享的文件夹就可以实现了. 第1步,安装haneWin软件.下载地址

利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别

用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077.html 使用OpenCV 调用摄像头 import face_recognition import cv2 video_capture = cv2.VideoCapture(0) # VideoCapture打开摄像头,0为笔记本内置摄像头,1为外USB摄像头,或写入视频路径 mayun_img

win7系统下,vs2010一调式,vs就关闭要重启

进入我的文档 %appdata%\Microsoft\VisualStudio, 将 10.0 重命名.网上找的方法有些问题,可能找这路径很难找到啊. 于是自己 找了找 一般都在当前用户文件夹下 AppData\Roaming\Microsoft\VisualStudio 因为用的是vs10, 那我们就随便改一下就行了. 然后直接重启vs看看是不是问题解决了,这个方法希望能帮到大家.网上还有的说在调式的时候打开了金山杀毒软件,这个没有遇到过自己机器也没装这个软件. win7系统下,vs2010一

32位win7系统下配置IIS遇到php-cgi.exe - FastCGI 进程意外退出问题的解决办法

今天重装了一下系统,是32位的WIN7,装完系统后想把IIS装回来,因为有时候需要用到笔记本处理一些事情,结果WEB服务器正常了,但IIS的FASTCGI模块始终不能解析PHP,一直报php-cgi.exe - FastCGI 进程意外退出的错误,于是上网找了一下解决办法,将解决过程写下来,以备忘: 解决的思路很简单,既然是不能解析PHP,那就直接运行一下PHP,看会报什么错,再对症下药,于是,在命令提示符窗口进入php安装的根目录,然后运行php -v的命令,这时窗口弹出计算机丢失msvcr1

win7系统下安装bugzilla-4.4.9

前言: 本来想安装jira的,但是安装包比较难找,而且还要收费,于是弃之.无意间发现bugzilla,免费安装包也好下载,就是配置复杂了些,没想那么多直接开始干了. 安装过程: 提前准备以下安装子项条件: 1.你得有个自带win7系统的电脑,如果没有请自行pass以下步骤. 2.win7系统下,安装了数据库,我自带的oracle,官网例子是mysql,网速太差,下载不了mysql安装包,放弃mysql. 3.还要安装perl 自行到 官网下载:  http://www.ActiveState.c

win7系统下用vspd软件进行串口编程实例

http://blog.csdn.net/qiusuo800/article/details/8299777 目前,我在学习C#串口编程类的基础知识,在网上也找了一些资料,但都存在一些问题,现在他们基础上再进行一定的修改,且更详细的表达如何实现串口编程,实现串口的发送与接收.本文通过一个完整的实例,目的在于说明在win7系统中进行串口编程时: 1.  用C# 编程串口的属性定义.成员变量以及方法等问题: 2.  掌握串口的发送与接收,利用虚拟串口来进行通讯,体验串口通讯: 至于具体的串口通信原理

调试opencv调用摄像头程序时碰到的问题

昨天晚上想把opencv学习笔记整理一下,当跑opencv调用摄像头的程序的时候老是出现Assertion failed (size.width>0 && size.height>0) in cv::imshow,最后查阅资料知道了是因为调用imshow()函数的时候传入的Mat为空导致的,可能是刚开始的时候摄像头并没有初始化成功,就调用imshow()导致程序已启动就down掉了,只要在while循环中判断一下传入的Mat是否为空就解决了 #include <openc