OpenCV使用VideoInput库从摄像头捕获视频

转自http://kqwd.blog.163.com/blog/static/412234482010611105013322/

OpenCV具有强大的图像处理功能,处理视频也是毫不逊色。只是其自带的HighGUI并非是具有工业强度的模块,不适合最终提供给客户,仅仅是方便程序开发阶段的调试。其中跟视频捕获相关的cvCreateCameraCapturecvCaptureFromCAM函数可以方便的从摄像头捕获视频,但这两个函数在Windows中都是由较为低效的VFW机制实现的,不适合在最终产品中使用。

Windows中使用DirectShow可以高效的从摄像头捕获视频,但使用较为复杂。OpenCV中文网的YuShiQi提供了一个基于DirectShow实现的摄像头捕获类,但试用后效果一般,速度并没有明显的提高。

新版的OpenCVOpenCV 2.0及以后版本)提供了第三方的VideoInput库,该库实现了基于DirectShow的视频捕获,使用方便、功能强大,速度也很快。另外还有一个意外发现——腾讯QQ的视频捕获貌似用的也是这个库哦~~

好了,下面就说说如何使用这个库

如果你的OpenCV版本低于2.0,请先去http://muonics.net/school/spring05/videoInput/

下载VideoInput,我这里需要翻墙才能上去。如果使用2.0及以后版本则自带该库。

首先需要在代码中包含VideoInput的头文件

#include <videoInput.h>

         这个文件的默认路径是C:OpenCV2.13rdpartyinclude

         静态链接库的默认路径是C:OpenCV2.13rdpartylib

         请先设置IDE中头文件和库文件的搜索路径。

 

下面给出一个读取并显示摄像头画面的实例

int width=320;

int height=240;

IplImage *pRgb=cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 3);

videoInput video;//创建视频捕获对象

video.setupDevice(0, width, height);//配置设备

video.showSettingsWindow(0);//该语句可以显示视频设置窗口,可以去掉

while(1)

{

   if(video.isFrameNew(0))

   {

        video.getPixels(0, (unsigned char *)pRgb->imageData, false, true);//获取一帧

        //cvFlip(pRgb,NULL,1);//加上这句就水平翻转画面

        char c=cvWaitKey(1);

        if(c==27) break;//ESC退出

        cvShowImage(Video, pRgb);

   }

}

 

有朋友提出编译时可能会遇到如下错误:

"fatal error LNK1104: cannot open file 'atlthunk.lib'"

如果遇到此错误,请在文件的开头加入如下语句:

#pragma comment(linker, "/NODEFAULTLIB:atlthunk.lib")


这个类库还提供了非常强大的功能,具体函数可以查看videoInput.h头文件。下面附上videoInput类的共有成员函数列表和相关说明。

//turns off console messages - default is to print messages

static void setVerbose(bool _verbose);

 

//Functions in rough order they should be used.

static int listDevices(bool silent = false);

 

//needs to be called after listDevices - otherwise returns NULL

static char * getDeviceName(int deviceID);

 

//choose to use callback based capture - or single threaded

void setUseCallback(bool useCallback);

 

//call before setupDevice

//directshow will try and get the closest possible framerate to what is requested

void setIdealFramerate(int deviceID, int idealFramerate);

 

//some devices will stop delivering frames after a while - this method gives you the option to try and reconnect

//to a device if videoInput detects that a device has stopped delivering frames.

//you MUST CALL isFrameNew every app loop for this to have any effect

void setAutoReconnectOnFreeze(int deviceNumber, bool doReconnect, int numMissedFramesBeforeReconnect);

 

//Choose one of these four to setup your device

bool setupDevice(int deviceID);

bool setupDevice(int deviceID, int w, int h);

 

//These two are only for capture cards

//USB and Firewire cameras souldn't specify connection

bool setupDevice(int deviceID, int connection);

bool setupDevice(int deviceID, int w, int h, int connection);

 

//If you need to you can set your NTSC/PAL/SECAM

//preference here. if it is available it will be used.

//see #defines above for available formats - eg VI_NTSC_M or VI_PAL_B

//should be called after setupDevice

//can be called multiple times

bool setFormat(int deviceNumber, int format);

 

//Tells you when a new frame has arrived - you should call this if you have specified setAutoReconnectOnFreezeto true

bool isFrameNew(int deviceID);

 

bool isDeviceSetup(int deviceID);

   

//Returns the pixels - flipRedAndBlue toggles RGB/BGR flipping - and you can flip the image too

unsigned char * getPixels(int deviceID, bool flipRedAndBlue = true, bool flipImage = false);

 

//Or pass in a buffer for getPixels to fill returns true if successful.

bool getPixels(int id, unsigned char * pixels, bool flipRedAndBlue = true, bool flipImage = false);

 

//Launches a pop up settings window

//For some reason in GLUT you have to call it twice each time.

void showSettingsWindow(int deviceID);

 

//Manual control over settings thanks.....

//These are experimental for now.

bool setVideoSettingFilter(int deviceID, long Property, long lValue, long Flags = NULL, bool useDefaultValue =false);

bool setVideoSettingFilterPct(int deviceID, long Property, float pctValue, long Flags = NULL);

bool getVideoSettingFilter(int deviceID, long Property, long &min, long &max, long &SteppingDelta, long&currentValue, long &flags, long &defaultValue);

 

bool setVideoSettingCamera(int deviceID, long Property, long lValue, long Flags = NULL, bool useDefaultValue =false);

bool setVideoSettingCameraPct(int deviceID, long Property, float pctValue, long Flags = NULL);

bool getVideoSettingCamera(int deviceID, long Property, long &min, long &max, long &SteppingDelta, long&currentValue, long &flags, long &defaultValue);

 

//bool setVideoSettingCam(int deviceID, long Property, long lValue, long Flags = NULL, bool useDefaultValue = false);

 

//get width, height and number of pixels

int  getWidth(int deviceID);

int  getHeight(int deviceID);

int  getSize(int deviceID);

 

//completely stops and frees a device

void stopDevice(int deviceID);

 

//as above but then sets it up with same settings

bool restartDevice(int deviceID);

 

//number of devices available

int  devicesFound;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个使用 OpenCV 和 Dlib 摄像头中取人脸进行人眼检测的 C++ 程序示例: ```C++ #include <opencv2/opencv.hpp> #include <dlib/image_processing/frontal_face_detector.h> #include <dlib/image_processing.h> using namespace cv; using namespace dlib; int main() { // 打开摄像头 VideoCapture capture(0); if (!capture.isOpened()) { std::cout << "摄像头打开失败" << std::endl; return -1; } // 创建 Dlib 人脸检测器 frontal_face_detector detector = get_frontal_face_detector(); // 加载 Dlib 人脸关键点检测器 shape_predictor sp; deserialize("shape_predictor_68_face_landmarks.dat") >> sp; // 循环读取摄像头帧 Mat frame; while (capture.read(frame)) { // 将 OpenCV 图像转换为 Dlib 图像 cv_image<bgr_pixel> cimg(frame); // 使用 Dlib 检测人脸 std::vector<rectangle> faces = detector(cimg); if (faces.size() == 0) { imshow("人眼检测", frame); waitKey(10); continue; } // 循环遍历每个检测到的人脸 for (size_t i = 0; i < faces.size(); i++) { // 使用 Dlib 检测人脸关键点 full_object_detection shape = sp(cimg, faces[i]); // 循环遍历每个关键点 for (size_t j = 0; j < shape.num_parts(); j++) { // 如果是眼睛关键点 if (j >= 36 && j <= 41) { // 在 OpenCV 图像中画出关键点 Point p(shape.part(j).x(), shape.part(j).y()); circle(frame, p, 2, Scalar(0, 255, 0), -1); } } } // 显示 ### 回答2: 使用opencv和dlib摄像头中提取人脸并进行眼部检测,可以通过以下步骤实现: 1. 导入所需文件,包括opencv和dlib。 ```c++ #include <opencv2/opencv.hpp> #include <dlib/opencv.h> #include <dlib/image_processing.h> ``` 2. 创建一个视频捕捉对象,用于连接电脑上的摄像头。 ```c++ cv::VideoCapture capture(0); // 参数0表示连接默认摄像头 ``` 3. 加载dlib人脸检测器和眼部检测器。 ```c++ dlib::frontal_face_detector detector = dlib::get_frontal_face_detector(); dlib::shape_predictor predictor; ``` 4. 加载用于检测人眼的dlib预训练模型。 ```c++ dlib::deserialize("shape_predictor_68_face_landmarks.dat") >> predictor; ``` 5. 通过循环和帧处理每一帧图像,进行人脸和眼部检测。 ```c++ while (true) { cv::Mat frame; capture >> frame; // 读取一帧图像 cv::Mat gray_frame; cv::cvtColor(frame, gray_frame, cv::COLOR_BGR2GRAY); // 转换为灰度图像 // 使用dlib检测人脸 std::vector<dlib::rectangle> faces = detector(dlib::cv_image<unsigned char>(gray_frame)); for (int i = 0; i < faces.size(); i++) { dlib::rectangle face = faces[i]; // 使用dlib检测眼部 dlib::full_object_detection shape = predictor(dlib::cv_image<unsigned char>(gray_frame), face); // 绘制眼部边界框 for (int j = 36; j <= 47; j++) { cv::Point eye(shape.part(j).x(), shape.part(j).y()); cv::circle(frame, eye, 2, cv::Scalar(0, 0, 255), -1); } } // 显示处理后的帧图像 cv::imshow("Face and Eye Detection", frame); // 按下ESC键退出程序 if (cv::waitKey(1) == 27) break; } ``` 6. 释放相关资源并关闭窗口。 ```c++ capture.release(); cv::destroyAllWindows(); ``` 通过以上步骤,我们就可以使用opencv和dlib实现一个从摄像头中提取人脸并进行眼部检测的C程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值