如何在所需像素之间搜索对象
How to search for an object between desired pixels?
正如我在上一个问题中提到的,我无法获得有关使用 Viola - Jones 算法检测面部特征的准确结果。特别是在单独获得眼睛和嘴巴时,效果不佳。但是检测面部,眼睛和鼻子没有问题。因此我想到了一个简单的算法,即:
- 第 1 步:检测人脸
- 第 2 步:检测一对眼睛
- 第 3 步:搜索眼睛下方的鼻子对
- 第 4 步:搜索鼻子下方的嘴巴
- 第五步:找到一对眼睛的中点。搜索左眼中点右侧和鼻子上方。
- 第 6 步:对右眼做同样的事情。
在检测对象时,我使用cvHaarDetectObjects方法。但是使用这种方法,看起来不可能在所需像素之间搜索对象。那么是否有一些功能,例如"获取此图像,并在x和y之间搜索鼻子,x +宽度和y +高度像素,然后给我鼻子的坐标。
任何帮助都得到了认可。
我找到了答案。没有必要在所需的像素之间进行搜索。中提琴 - 琼斯算法已经像上面的简单算法一样找到了特征。因此,如果您按顺序搜索对象,它会毫无问题地找到面部特征。下面是一个示例代码:
void Detection::Detect()
{
FacialFeatures* facialFeatures = new FacialFeatures();
DrawRectangle(DetectFeature(faceDetector));
DrawRectangle(DetectFeature(eyesDetector));
DrawRectangle(DetectFeature(noseDetector));
DrawRectangle(DetectFeature(mouthDetector));
DrawRectangle(DetectFeature(leftEyeDetector));
DrawRectangle(DetectFeature(righteyeDetector));
}
CvRect* Detection::DetectFeature(const char* detectorType)
{
pCascade_ = (CvHaarClassifierCascade* ) cvLoad(detectorType,0,0,0);
pRectSeq_ = cvHaarDetectObjects(pImage_, pCascade_, pStorage_, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(20,20));
CvRect* r = (CvRect*) cvGetSeqElem(pRectSeq_,0);
return r;
}
void Detection::DrawRectangle(CvRect* r)
{
cvNamedWindow("Detected", CV_WINDOW_AUTOSIZE);
CvPoint pt1 = { r->x, r->y };
CvPoint pt2 = { r->x + r->width, r->y + r->height };
cvRectangle(pImage_, pt1, pt2, CV_RGB(0,255,0), 3, 4, 0);
cvShowImage("Detected", pImage_);
cvWaitKey(0);
}
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 有根的二进制搜索树.保留与其父级的链接
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 在C++中搜索嵌套多映射值
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 有序地图字符串搜索与整数搜索之间的时间复杂度
- 上界和下界的基本二进制搜索之间的差异
- XCode3 - 库搜索路径和项目框架之间的关系
- 搜索"+"和"n"字符之间的所有子句
- 在文件中搜索字符串(逐行),忽略单词之间空白的大小
- QDate -在两个日期之间搜索
- 二叉搜索树-值和键之间的区别是什么?
- 如何在所需像素之间搜索对象
- c++正则表达式搜索多行注释(在/* */之间)