社区导航

 

搜索
查看: 5519|回复: 14

[经验] Beaglebone外围电路设计心得Opencv 无刷电机

[复制链接]

249

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2012-10-24 22:29 | 显示全部楼层 |阅读模式
开源人脸识别基本功能代码
OpenCV这方面各项目开发国外已经很开源了,我们虚拟公司也参考和学习修改运用在修改调试过来的知反反复复了多少遍。

一 如何使用OpenCV的人脸检测器检测到人脸:

/ /执行的输入图像上的人脸检测,使用给定的(Haar)级联。
/ /返回一个矩形,在给定的图像中检测到的区域。
CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade)
{
/ /最小脸的大小.
CvSize minFeatureSize = cvSize(20, 20);
/ /只搜索一面.
int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;
/ /详细的搜索.
float search_scale_factor = 1.1f;
IplImage *detectImg;
IplImage *greyImg = 0;
CvMemStorage* storage;
CvRect rc;
double t;
CvSeq* rects;
CvSize size;
int i, ms, nFaces;
storage = cvCreateMemStorage(0);
cvClearMemStorage( storage );

/ /如果图像是彩色的,使用的灰度图像的副本.
detectImg = (IplImage*)inputImg;
if (inputImg->nChannels > 1) {
  size = cvSize(inputImg->width, inputImg->height);
  greyImg = cvCreateImage(size, IPL_DEPTH_8U, 1 );
  cvCvtColor( inputImg, greyImg, CV_BGR2GRAY );
  detectImg = greyImg; // Use the greyscale image.
}
//检测的灰度图像中的所有面.
t = (double)cvGetTickCount();
rects = cvHaarDetectObjects( detectImg, cascade, storage,
   search_scale_factor, 3, flags, minFeatureSize);
t = (double)cvGetTickCount() - t;
ms = cvRound( t / ((double)cvGetTickFrequency() * 1000.0) );
nFaces = rects->total;
printf("Face Detection took %d ms and found %d objects\n", ms, nFaces);
//获取第一个检测到的人脸(最大).
if (nFaces > 0)
  rc = *(CvRect*)cvGetSeqElem( rects, 0 );
else
  rc = cvRect(-1,-1,-1,-1); / /找不到的脸.
if (greyImg)
  cvReleaseImage( &greyImg );
cvReleaseMemStorage( &storage );
// cvReleaseHaarClassifierCascade的(级联);
return rc; / /返回发现最大的面,或(-1,-1,-1,-1).
}
// Haar的级联文件,使用的人脸检测.
char *faceCascadeFilename = "haarcascade_frontalface_alt.xml";
/ /加载的HaarCascade分类器进行人脸检测.
CvHaarClassifierCascade* faceCascade;
faceCascade = (CvHaarClassifierCascade*)cvLoad(faceCascadeFilename, 0, 0, 0);
if( !faceCascade ) {
printf("Couldnt load Face detector '%s'\n", faceCascadeFilename);
exit(1);
}
/ /获取下一帧的摄像头.
IplImage *inputImg = cvQueryFrame(camera);
/ /对输入图像执行面部检测,使用给定的(Haar)分类.
CvRect faceRect = detectFaceInImage(inputImg, faceCascade);
/ /确保有效侦测到脸部.
if (faceRect.width > 0) {
printf("Detected a face at (%d,%d)!\n", faceRect.x, faceRect.y);
}
.... Use 'faceRect' and 'inputImg' ....
//人脸检测程序完成时的资源cvReleaseHaarClassifierCascade(级联);


二  如何进行预处理,人脸图像的人脸识别:
/ /无论是将图像转换为灰度,或使用现有的灰度图像.
IplImage *imageGrey;
if (imageSrc->nChannels == 3) {
imageGrey = cvCreateImage( cvGetSize(imageSrc), IPL_DEPTH_8U, 1 );
        / /从RGB(实际上它是BGR)转换为灰度。
cvCvtColor( imageSrc, imageGrey, CV_BGR2GRAY );
}
else {
/ /只使用输入图像,因为它已经是灰度.
imageGrey = imageSrc;
}
/ /调整的图像的大小是一致的大小,即使宽高比变化.
IplImage *imageProcessed;
imageProcessed = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
/ /使图像具有固定大小.
/ / CV_INTER_CUBIC或CV_INTER_LINEAR的是良好的扩大,
/ //抽取伸缩CV_INTER_AREA是良好的,但糟糕的扩大.
cvResize(imageGrey, imageProcessed, CV_INTER_LINEAR);
/ /给一个标准的亮度和对比度的图像.
cvEqualizeHist(imageProcessed, imageProcessed);
.....  Use 'imageProcessed' for Face Recognition ....
if (imageGrey)
cvReleaseImage(&imageGrey);
if (imageProcessed)
cvReleaseImage(&imageProcessed);

  三 实现离线瞄准:

/ /告诉PCA退出的时候它有足够的特征脸.
CvTermCriteria calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, 1);
/ /计算平均图像,特征向量(特征脸)和特征(比率).
cvCalcEigenObjects(nTrainFaces, (void*)faceImgArr, (void*)eigenVectArr,
CV_EIGOBJ_NO_CALLBACK, 0, 0, &calcLimit,
pAvgTrainImg, eigenValMat->data.fl);
//标准化矩阵的特征值.
cvNormalize(eigenValMat, eigenValMat, 1, 0, CV_L1, 0);
/ /每个training项目的PCA子空间上的图像.
CvMat projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 );
int offset = projectedTrainFaceMat->step / sizeof(float);
for(int i=0; i cvEigenDecomposite(faceImgArr, nEigens, eigenVectArr, 0, 0,
  pAvgTrainImg, projectedTrainFaceMat->data.fl + i*offset);
}



    四 实现从相机的实时识别:
/ /获取下一个摄像机框架。等待,直到下一帧是准备好了,
/ /提供直接访问它,所以不要修改或释放返回的图像!
/ /将自动初始化摄像头,在第一帧上.
IplImage* getCameraFrame(CvCapture* &camera)
{
IplImage *frame;
int w, h;
/ /如果相机没有被初始化,然后打开它.
if (!camera) {
  printf("Acessing the camera ...\n");
  camera = cvCreateCameraCapture( 0 );
  if (!camera) {
   printf("Couldn't access the camera.\n");
   exit(1);
  }
  / /尝试设置相机的分辨率为320×240.
  cvSetCaptureProperty(camera, CV_CAP_PROP_FRAME_WIDTH, 320);
  cvSetCaptureProperty(camera, CV_CAP_PROP_FRAME_HEIGHT, 240);
  / /获取第一帧,以确保相机初始化.
  frame = cvQueryFrame( camera );
  if (frame) {
   w = frame->width;
   h = frame->height;
   printf("Got the camera at %dx%d resolution.\n", w, h);
  }
  / /等待一点点,使相机可以自动调节其亮度.
  Sleep(1000); / /(以毫秒为单位)
}
/ /等待下一个摄像机的帧准备就绪,然后抓住它.
frame = cvQueryFrame( camera );
if (!frame) {
  printf("Couldn't grab a camera frame.\n");
  exit(1);
}
return frame;
}
CvCapture* camera = 0; / /摄像头装置.
while ( cvWaitKey(10) != 27 ) { // 退出“ "Escape"的关键.
IplImage *frame = getCameraFrame(camera);
...
}
// /相机.
cvReleaseCapture( &camera );

人脸识别程序参考.rar (26.87 KB, 下载次数: 25)


回复

使用道具 举报

249

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2012-10-24 22:32 | 显示全部楼层
怎么后面字体这样了


回复

使用道具 举报

6532

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2012-10-25 00:38 | 显示全部楼层
怎么从相机获取数据啊

点评

通过一个OpenCV的一个函数 例如:camera = cvCaptureFromCAM( 0 ); OpenCV提供 \'cvCreateCameraCapture()\' 功能 (也称为\'cvCaptureFromCAM()\') 你可以参考我最后一段例子程序的。  详情 回复 发表于 2012-10-25 08:51
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰


回复

使用道具 举报

249

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2012-10-25 08:51 | 显示全部楼层

回复 板凳 chenzhufly 的帖子

通过一个OpenCV的一个函数
例如:camera = cvCaptureFromCAM( 0 );
OpenCV提供  'cvCreateCameraCapture()'    功能  (也称为'cvCaptureFromCAM()')
你可以参考我最后一段例子程序的。


回复

使用道具 举报

6532

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2012-10-25 09:41 | 显示全部楼层
硬件上相机是怎么接的,采用什么接口

点评

我这个不打算用开展的IO口去接摄像头 直接使用板子上自带的USB口。  详情 回复 发表于 2012-10-25 10:16
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰


回复

使用道具 举报

249

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2012-10-25 10:16 | 显示全部楼层

回复 5楼 chenzhufly 的帖子

我这个不打算用开展的IO口去接摄像头  直接使用板子上自带的USB口。


回复

使用道具 举报

6532

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2012-10-25 10:29 | 显示全部楼层
哇  好东西!
接USB的搞定了吗?
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰


回复

使用道具 举报

249

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2012-10-25 10:34 | 显示全部楼层
哈哈  这个交给  其他人搞有老师帮应该不成问题 我最近要外出几天。


回复

使用道具 举报

24

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2013-8-18 15:21 | 显示全部楼层

你用的opencv版本是那个?

你用的opencv版本是那个?

点评

2.4 版本的  详情 回复 发表于 2013-8-18 20:18


回复

使用道具 举报

249

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2013-8-18 20:17 | 显示全部楼层
2.4  版本的


回复

使用道具 举报

249

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2013-8-18 20:18 | 显示全部楼层

回复 9楼CX4359481 的帖子

2.4  版本的


回复

使用道具 举报

621

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

荣誉会员勋章

发表于 2013-8-22 20:31 | 显示全部楼层
先行MARK 以备不时之需
Net:Wxeda.taobao.com
QQ:1035868547
Blog:http://home.eeworld.com.cn/space-uid-390804.html


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2014-3-24 11:30 | 显示全部楼层
请问你在开发板上使用的是那个linux发行版本?怎样移植opencv的?


回复

使用道具 举报

8

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2014-11-6 13:08 | 显示全部楼层
thanks


回复

使用道具 举报

131

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-11-12 14:17 | 显示全部楼层
所述与标题不一致,希望能把无刷电机的说明贴出来。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/4 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-4-3 06:11 , Processed in 0.432571 second(s), 22 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表