C++ 如何从dlib上的dlib::矩形创建cv::Mat';s array2d<;rgb_像素>;形象?
我正在使用dlib的hog检测器,因为它比opencv haarcascades发现的人脸要好得多。但是它不能检测到脸上的情绪(或者可以??)。我需要从dlib::rectangle with face中提取一个“子图像”,并从中创建cv::Mat,以调用带有预加载“haarcascade_smile.xml”的cv::detectMultiScale() 如何执行此提取/转换 下面的代码示例C++ 如何从dlib上的dlib::矩形创建cv::Mat';s array2d<;rgb_像素>;形象?,c++,opencv,dlib,C++,Opencv,Dlib,我正在使用dlib的hog检测器,因为它比opencv haarcascades发现的人脸要好得多。但是它不能检测到脸上的情绪(或者可以??)。我需要从dlib::rectangle with face中提取一个“子图像”,并从中创建cv::Mat,以调用带有预加载“haarcascade_smile.xml”的cv::detectMultiScale() 如何执行此提取/转换 下面的代码示例 int DetectionProc(void * param){ // async operation
int DetectionProc(void * param){ // async operation
auto instance =(Detector *)param;
const unsigned int delay = 1000 / instance->OPS;
std::vector<dlib::rectangle> detects;
array2d<rgb_pixel> sample;
while(instance->OPS){
unsigned int elapsed = GetTickCount();
EnterCriticalSection(&instance->cs_buf);
assign_image(sample,instance->buffer);
instance->buffer.clear();
LeaveCriticalSection(&instance->cs_buf);
if (sample.size()){
detects = instance->face_detector(sample);
if (!detects.empty()){
detection res(GetTickCount());
if (!instance->smile_detector.empty()){
// TODO
// extract subimage from detects.front() on sample to cv::Mat face;
// instance->smile_detector.detectMultiScale(); on face
// set res.smiled to true on success
}
EnterCriticalSection(&instance->cs_result);
instance->result = res;
LeaveCriticalSection(&instance->cs_result);
}
}
elapsed = GetTickCount() - elapsed;
Sleep((elapsed < delay) ? (delay - elapsed) : 0);
}
return 0;
}
int-DetectionProc(void*param){//异步操作
自动实例=(检测器*)参数;
const unsigned int delay=1000/实例->操作;
向量检测;
阵列2d样品;
while(实例->操作){
unsigned int appeased=GetTickCount();
EnterCriticalSection(&instance->cs\u buf);
分配_映像(示例、实例->缓冲区);
instance->buffer.clear();
离开CriticalSection(&instance->cs_buf);
if(sample.size()){
检测=实例->人脸检测器(样本);
如果(!detect.empty()){
检测分辨率(GetTickCount());
如果(!instance->smile\u detector.empty()){
//待办事项
//从样本上的detects.front()提取子图像到cv::Mat face;
//实例->脸上的微笑检测器。检测多尺度()
//成功时,将微笑归为真
}
EnterCriticalSection(&实例->cs\u结果);
实例->结果=res;
离开CriticalSection(&instance->cs\u结果);
}
}
已用=GetTickCount()-已用;
睡眠((经过<延迟)?(延迟-经过):0);
}
返回0;
}
有两种方法可以实现这一点,一种是通过dlib()中的提取图像芯片
功能,另一种是使用相应的OpenCV API从包装中提取子图像。您将使用哪一个取决于该选择对其余处理管道的方便程度
从您的示例得出结论,OpenCV路径似乎是最方便的(但请再次查看设计和API选项):
//1.)将“示例”dlib图像包装在cv::Mat中
//dlib::toMat()可通过#include获得
cv::Mat sample_Mat=dlib::toMat(样品);
//2.)反复进行检测
用于(常量自动和矩形:检测)
{
//3.)使用OpenCV提取矩形子图像
cv::Mat rect_sub=样本_Mat(
cv::Rect(Rect.left(),Rect.top(),Rect.width(),Rect.height());
//4.)处理子图像
}
有两种方法可以实现这一点,一种是通过dlib()中的提取图像芯片
功能,另一种是使用相应的OpenCV API从包装中提取子图像。您将使用哪一个取决于该选择对其余处理管道的方便程度
从您的示例得出结论,OpenCV路径似乎是最方便的(但请再次查看设计和API选项):
//1.)将“示例”dlib图像包装在cv::Mat中
//dlib::toMat()可通过#include获得
cv::Mat sample_Mat=dlib::toMat(样品);
//2.)反复进行检测
用于(常量自动和矩形:检测)
{
//3.)使用OpenCV提取矩形子图像
cv::Mat rect_sub=样本_Mat(
cv::Rect(Rect.left(),Rect.top(),Rect.width(),Rect.height());
//4.)处理子图像
}
// 1.) Wrap your "sample" dlib-image in cv::Mat
// dlib::toMat() is available through #include <dlib/opencv.h>
cv::Mat sample_mat = dlib::toMat(sample);
// 2.) Iterate through your detections
for (const auto& rect: detects)
{
// 3.) Extract the rectangle sub-image using OpenCV
cv::Mat rect_sub = sample_mat(
cv::Rect(rect.left(), rect.top(), rect.width(), rect.height()));
// 4.) Process the sub-image
}