我使用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上没有问题。
我不明白我做错了什么
答案 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);
}