赞
踩
之前简答得实现了一下人脸检测,不过使用的opencv自带的摄像头操作函数,然而那个并不能使用在嵌入式设备上,为了通用性,我将让opencv使用v4l2获得的数据帧进行检测。
说明
v4l2其实并不难,只不过大家容易被网上那动辄几百行的代码唬住,那些代码大多都是在检错,因为操作硬件这种事情出错的概率确实很高,每一步都可能出错,但是核心的语句也就那几行,这里推荐这几篇文章(点我跳转),我都已经仔细读过,含金量比较高,当然英语好直接都自带文档也是极好的。
opencv与v4l2结合的问题就是数据格式,因为我使用的是Qt,v4l2获得的数据帧会转换为QImage类型,OpenCV则主要使用Mat类型,不过不用担心,简单转换一下就可以了,这篇文章给出了转换方式,由于是一个工程,所以只上OpenCV部分的代码了。
代码
需要下载整个项目的(点我下载)
#include "facedetect.h"
FaceDetect::FaceDetect()
{
this->tryflip = false;
this->cascade.load("/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml");
this->nestedCascade.load("/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml");
this->scale = 1.5;
}
void FaceDetect::setMatImageFromQImage(QImage img)
{
this->image = QImage2cvMat(img).clone();
}
QImage FaceDetect::getQImage()
{
return cvMat2QImage(detectAndDraw(image, cascade, nestedCascade, scale, tryflip));
}
QImage FaceDetect::cvMat2QImage(const cv::Mat& mat)
{
// 8-bits unsigned, NO. OF CHANNELS = 1
if(mat.type() == CV_8UC1)
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
// Set the color table (used to translate colour indexes to qRgb values)
//printf("set colors\n");
image.setNumColors(256);
for(int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。