openCV to dlib - Mat to array2d

时间:2018-01-25 21:37:38

标签: c++ opencv dlib

我使用OpenCV成功打开并显示.avi视频,我需要通过OpenCV,因为我想学习如何使OpenCV和dlib进行通信。

根据我的理解,Mat必须转换为array2d才能由dlib处理,所以这是我的第一次尝试:

cv::VideoCapture cap("/home/francesco/Downloads/05-1.avi");
cv::namedWindow("UNLTD", CV_WINDOW_AUTOSIZE);

while(1)
{
    cv::Mat temp;
    cv_image<bgr_pixel> cimg(temp);

    std::vector<rectangle> faces = detector(cimg);
    cout << faces.size() << endl;

    cv::imshow("UNLTD", temp);
 }

这会返回错误

Error detected in file /usr/local/include/dlib/opencv/cv_image.h.
Error detected in function dlib::cv_image<pixel_type>::cv_image(cv::Mat) [with pixel_type = dlib::bgr_pixel].

Failing expression was img.depth() == cv::DataType<typename pixel_traits<pixel_type>::basic_pixel_type>::depth && img.channels() == pixel_traits<pixel_type>::num.
The pixel type you gave doesn't match pixel used by the open cv Mat object.
     img.depth():    0
     img.cv::DataType<typename pixel_traits<pixel_type>::basic_pixel_type>::depth: 0
     img.channels(): 1
     img.pixel_traits<pixel_type>::num: 3

我尝试将bgr_pixel换成rgb_pixel,但没有任何运气。 在互联网上看,有人提到img.depth()为零,因此我应该使用unsigned char而不是rgb_pixel。

第一件事:我的视频正在播放颜色,所以它有3个频道,我不明白为什么它应该被解释为1频道图像。

奇怪的是,从rgb_pixel更改为unsigned char,使软件正常工作,但在该视频流上检测到ZERO面部(这是一个人说话的视频,同一视频上的面部被检测到dlib在python上没有问题。

我不明白我做错了什么

1 个答案:

答案 0 :(得分:0)

在您的代码中,temp为空,因为您尚未从视频捕获中向其提供任何帧。将cv::Mat转换为dlib::array2d也不正确。有关详细信息,请参阅this post

您可以尝试:

cv::VideoCapture cap("/home/francesco/Downloads/05-1.avi");
cv::namedWindow("UNLTD", CV_WINDOW_AUTOSIZE);
dlib::frontal_face_detector  detector = dlib::get_frontal_face_detector();

while(1)
{
    cv::Mat temp;
    cap >> temp;

    dlib::array2d<bgr_pixel> dlibFrame;
    dlib::assign_image(dlibFrame, dlib::cv_image<bgr_pixel>(temp));

    std::vector<rectangle> faces = detector(dlibFrame);
    cout << faces.size() << endl;

    cv::imshow("UNLTD", temp);
}