Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从dlib上的dlib::矩形创建cv::Mat';s array2d<;rgb_像素>;形象?_C++_Opencv_Dlib - Fatal编程技术网

C++ 如何从dlib上的dlib::矩形创建cv::Mat';s array2d<;rgb_像素>;形象?

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

我正在使用dlib的hog检测器,因为它比opencv haarcascades发现的人脸要好得多。但是它不能检测到脸上的情绪(或者可以??)。我需要从dlib::rectangle with face中提取一个“子图像”,并从中创建cv::Mat,以调用带有预加载“haarcascade_smile.xml”的cv::detectMultiScale()

如何执行此提取/转换

下面的代码示例

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
}