人脸识别摄像头要求打开前置摄像头头失败是什么原因

一般来说,opencv要打开摄像头的话,可以使用:VideoCapture captRefrnc(0); 这类方式。
重装系统之后,为了避免安装巨大的visual studio,改成了codeblocks,另外opencv也采用cmake+codeblocks的方式编译而成,但是采用默认设置编译出来的opencv无法开启笔记本电脑的摄像头,尝试其他解决方法之后,想到了之前用过的&K-Lite Codec Pack 配合avisynth编写avs脚本解决解码器的思路,利用K-Lite Codec Pack+avs脚本来打开摄像头。
如果你也遇到opencv无法打开摄像头问题而无法解决,不妨尝试这种方案。
准备工作:
1:安装K-Lite Codec Pack,选择full版本安装,这样可以得到后续要用的GraphStudioNext
2:安装avisynth
3:安装avisynth-as-directshow-capture
安装完成之后,打开GraphStudioNext
进入程序后,用Ctrl+F快捷键,或者点击Graph-&Insert Filter
找到你的摄像头,一般来说会有cam关键字,我的叫做Intergrated Webcam,选择它,并点击insert
选择好你的Cam,之后用File-&Save As Graph,保存出.grf文件,比如我的是:E:\cam.avs
下一步便是编写avs脚本打开这个grf文件就行了
打开记事本,输入directshowsource("E:\cam.GRF", audio=False, framecount=1000000, fps=10)&
保存成filename.avs
之后用Media player classic打开这个文件测试是否成功,如果能用Media player classic 打开摄像头就是成功了。
之后只需要像打开视频文件一样在opencv里打开这个avs文件就可以了:
VideoCapture captRefrnc("E:\cam.avs");
OpenCV打不开摄像头的替代解决方案
设想:之前使用C#控制摄像头的,现在厌烦了windows,决定转移到linux下玩耍。感觉能够python语言特有的好入手,正好替代C#,选择了deepin2014.1作为试验品。现在的设想是第一步
,然后就把-1修改成了0,结果可以正常打开摄像头了具体原因我也没有搞清楚,查了Opencv的官方文档:OpenCV中一个函数。初始化从摄像头中获取视频CvCapture*cvCaptureFromCAM
opencv中具有检测人体各部分的级联分类器,在opencv文件夹里面的sources/data/haarcascades里面。这里要选择的是能够检测人体头像的还有检测眼睛的级联分类器的文件。它们分
=cvCaptureFromCAM(-1);CvVideoWriter*video=NULL;IplImage*frame=NULL;if(!capture)//如果不能打开摄像头给出警告{cout&&lt
()#把摄像头也顺便关了cv2.destroyAllWindows()opencv视频抓取好简单,主要用videowriter就可以了,主要要注意的是opencv中的抓取是放在内存中的,所以需要一个
本程序通过JFrame实时显示本机摄像头图像,并将图像存储到一个缓冲区,当用户用鼠标点击JFrame中任何区域时,显示抓取图像的简单动画,同时保存缓冲区的图像到磁盘文件中。点击JFrame关闭按钮
之前在QTcreator上成功编译了opencv,由于课题需要,需要采集摄像头的信息。故搜集了网上的一些资料,依葫芦画瓢的照着做了一下,终于简单的成功采集了信息。打开QTcreator,新建一个
在虚拟机搭建好系统后,真正的使用才刚刚开始。在使用摄像头的时候,首先看自己的摄像头插上去是显示jpeg的还是yuv的yuv的要实现UVC转QImage转IplImage这样的流程才能使用,jpeg
正则表达式在线测试工具
FaceYe @ 2015 &&&&
ICP备案号:粤ICP备150007014957人阅读
opencv(2)
前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,OpenCV的环境配置网上有很多,不再赘述。检测的代码网上很多,记不清楚从哪儿copy的了,识别的代码是从OpenCV官网上找到的:http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_api.html
需要注意的是,opencv的FaceRecogizer目前有三个类实现了它,特征脸和fisherface方法最少训练图像为两张,而LBP可以单张图像训练。本人的实验采用的图片是100x100大小的,所以如果要添加自己的图像进行识别的话务必调整为100x100,不然会报错。当然在recog_and_draw这个函数里,笔者也将每次检测到的人脸进行了保存,拖出来重命名就可以,路径自己找吧。使用不同的方法识别时,其阈值设置也不同,LBP大概在100,其他两种方法大概在1000。本人的代码已共享,下载链接:
ps:有人说代码的检测率不高,其实可以归结为两方面的原因,第一人脸检测率不高,这个可以通过嵌套检测嘴角、眼睛等来降低,或者背景、光照固定的话可以通过图像差分来解决;第二是识别方法本身的问题,如果想提高识别率,可以添加多张不同姿态、光照下的人脸作为训练的样本,如果有时间的话可以在采集图像时给出一个人脸框,引导用户对齐人脸进行采集,三星手机解除锁屏就有这么一个功能。
废话不多说,上传代码。
detect_recog.cpp:
detect_recog.h:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:498243次
积分:5316
积分:5316
排名:第3574名
原创:107篇
转载:80篇
评论:94条
(1)(2)(2)(2)(3)(3)(1)(5)(2)(1)(1)(3)(8)(3)(3)(3)(5)(5)(2)(4)(1)(1)(1)(2)(4)(2)(1)(2)(1)(4)(2)(2)(2)(2)(2)(1)(2)(2)(1)(2)(1)(1)(3)(2)(3)(14)(14)(2)(1)(1)(2)(3)(2)(1)(3)(2)(1)(4)(1)(7)(1)(3)(7)(6)(2)(3)(7)(1)(1)(2)(2)Computer Vision(9)
对opencv2..4.4的例程人脸识别程序,进行了精简,只处理摄像头传来的数据,挺有意思的。
#include &opencv2/objdetect/objdetect.hpp& //物体检测库
#include &opencv2/highgui/highgui.hpp&
//图形视频处理库
#include &opencv2/imgproc/imgproc.hpp&
//brief The Image Processing
#include &cctype&
#include &iostream&
#include &iterator&
#include &stdio.h&
void detectAndDraw( Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip );
string cascadeName = &haarcascade_frontalface_alt.xml&;
//人脸的训练数据
//string nestedCascadeName = &haarcascade_eye_tree_eyeglasses.xml&; //人眼的训练数据
string nestedCascadeName = &haarcascade_eye.xml&;
//人眼的训练数据
int main()
//参数选项定义
CvCapture* capture = 0;
//视频获取结构
Mat frame, frameCopy, //定义矩阵
bool tryflip =
CascadeClassifier cascade, nestedC //定义级联分类器对象
double scale = 1;
if( !cascade.load( cascadeName ) ) //加载级联分类器(人脸)
cerr && &ERROR: Could not load classifier cascade& &&
return -1;
if(!nestedCascade.load(nestedCascadeName)) //加载级联分类器(人眼)
cerr&&&ERROR: Could not load classifier nestedCascade&&&
return -1;
capture = cvCaptureFromCAM( 0 ); //读取摄像头
cvNamedWindow( &result&, 1 );
//定义显示窗口
if( capture ) //摄像头
cout && &In capture ...& &&
cvQueryFrame函数从摄像头或者视频文件中抓取并返回一帧。
cvQueryFrame返回的指针总是指向同一块内存。
建议cvQueryFrame后拷贝一份。
而且返回的帧需要FLIP后才符合OPENCV的坐标系。
IplImage* iplImg = cvQueryFrame( capture );
//从摄像头或文件中抓取一帧
frame = iplI
if( frame.empty() )
if( iplImg-&origin == IPL_ORIGIN_TL )
frame.copyTo( frameCopy );
//拷贝一份
flip( frame, frameCopy, 0 ); //反转
detectAndDraw( frameCopy, cascade, nestedCascade, scale, tryflip );
//识别并绘出
if( waitKey( 10 ) &= 0 ) //等待,处理键盘事件
goto _cleanup_;
waitKey(0);
_cleanup_:
cvReleaseCapture( &capture );
cerr&&&Can't read from CAM&;
cvDestroyWindow(&result&); //销毁显示窗口,释放资源
void detectAndDraw( Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip )
int i = 0;
double t = 0;
vector&Rect& faces, faces2;
//定义人脸容器
const static Scalar colors[] =
{ CV_RGB(0,0,255),
CV_RGB(0,128,255),
CV_RGB(0,255,255),
CV_RGB(0,255,0),
CV_RGB(255,128,0),
CV_RGB(255,255,0),
CV_RGB(255,0,0),
CV_RGB(255,0,255)} ; //定义不同的颜色表示不同的人脸
Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); //缩小图片,加快识别速度
cvtColor( img, gray, CV_BGR2GRAY );
//二值图(灰度图)
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); //将尺寸缩小到1/scale,用线性插值
equalizeHist( smallImg, smallImg );
//使灰度图象直方图均衡化
t = (double)cvGetTickCount(); //获取时间
detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,faces表示检测到的人脸目标序列,
1.1表示每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素
和不同的窗口大小都可以检测到人脸),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,
Size(30, 30)为目标的最小最大尺寸
cascade.detectMultiScale( smallImg, faces,
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
|CV_HAAR_SCALE_IMAGE,
Size(30, 30) );
//识别多目标(人脸)
if( tryflip )
flip(smallImg, smallImg, 1);
cascade.detectMultiScale( smallImg, faces2,
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
|CV_HAAR_SCALE_IMAGE,
Size(30, 30) );
for( vector&Rect&::const_iterator r = faces2.begin(); r != faces2.end(); r++ )
faces.push_back(Rect(smallImg.cols - r-&x - r-&width, r-&y, r-&width, r-&height)); //人脸添加进容器
t = (double)cvGetTickCount() -
printf( &detection time = %g ms\n&, t/((double)cvGetTickFrequency()*1000.) );
//绘出结果
for( vector&Rect&::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
Mat smallImgROI; //人眼识别区
vector&Rect& nestedO //定义人眼容器
Scalar color = colors[i%8]; //区分颜色
double aspect_ratio = (double)r-&width/r-&
if( 0.75 & aspect_ratio && aspect_ratio & 1.3 )
center.x = cvRound((r-&x + r-&width*0.5)*scale); //还原成原来的大小
center.y = cvRound((r-&y + r-&height*0.5)*scale);
radius = cvRound((r-&width + r-&height)*0.25*scale);
circle( img, center, radius, color, 3, 8, 0 ); //画圆,标示人脸
rectangle( img, cvPoint(cvRound(r-&x*scale), cvRound(r-&y*scale)),
cvPoint(cvRound((r-&x + r-&width-1)*scale), cvRound((r-&y + r-&height-1)*scale)),
color, 3, 8, 0);
if( nestedCascade.empty() )
smallImgROI = smallImg(*r);
nestedCascade.detectMultiScale( smallImgROI, nestedObjects,
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
//|CV_HAAR_DO_CANNY_PRUNING
|CV_HAAR_SCALE_IMAGE,
Size(30, 30) );
//识别人眼
for( vector&Rect&::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )
center.x = cvRound((r-&x + nr-&x + nr-&width*0.5)*scale);
center.y = cvRound((r-&y + nr-&y + nr-&height*0.5)*scale);
radius = cvRound((nr-&width + nr-&height)*0.25*scale);
circle( img, center, radius, color, 3, 8, 0 ); //标出人眼
cv::imshow( &result&, img ); //显示结果
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:24226次
排名:千里之外
原创:24篇
评论:17条
(1)(1)(1)(2)(1)(4)(1)(1)(4)(4)(1)(3)(1)(1)借贷宝提现时显示打开前置摄像头失败怎么办_百度知道

我要回帖

更多关于 opencv摄像头人脸识别 的文章

 

随机推荐