一、dlib::matrix转换成cv::Mat
1、注意事项:
1)将dlib::matrix转成BGR格式后,再转换成cv::Mat,因为cv::Mat中是按照BGR顺序存储
2)注意最后添加的cv::Mat::clone()函数,因为dlib::toMat(tmp)返回的mat数据部分在tmp中,tmp是临时变量,因此在函数返回前,执行clone()操作。
2、代码:
//将dlib::matrix转成BGR格式后,再转换成cv::Mat,因为cv::Mat中是按照BGR顺序存储
template <typename T, long NR, long NC, typename mm, typename l>
void dlibMatrix2cvBGR(cv::Mat &dest, const dlib::matrix<T, NR, NC, mm, l> &src)
{
dlib::matrix<dlib::bgr_pixel> tmp;
dlib::assign_image(tmp, src);
dest = dlib::toMat(tmp).clone();
}
//将dlib::matrix直接转成cv::Mat,尽量保持原样;将rgb、rgba转换成bgr、bgra;
//注意该方法有一个bug,无法识别bgr格式,因此会错误的将bgr转成成rgb。
template <typename T, long NR, long NC, typename mm, typename l>
void dlibMatrix2cv(cv::Mat &dest, dlib::matrix<T, NR, NC, mm, l> &src)
{
//声明dlib命名空间,否则编译会报错
using namespace dlib;
dest = dlib::toMat(src);
if (dlib::pixel_traits<T>::rgb){
cv::cvtColor(dest, dest, cv::COLOR_RGB2BGR);
} else if (dlib::pixel_traits<T>::rgb_alpha) {
cv::cvtColor(dest, dest, cv::COLOR_RGBA2BGRA);
}else if (dlib::pixel_traits<T>::hsi) {
//使用原生的数据,不做转换
//cv::cvtColor(dest, dest, cv::COLOR_HSV2BGR);
}else if (dlib::pixel_traits<T>::lab) {
//使用原生的数据,不做转换
//cv::cvtColor(dest, dest, cv::COLOR_Lab2BGR);
}else if (dlib::pixel_traits<T>::grayscale) {
}
}
二、cv::Mat 转 dlib::matrix
1)cv::Mat转dlib::matrix时,要注意matrix的模板类型和mat的类型要匹配否则报错,
可以在转换前判读类型是否合法(如下面代码所示),或者使用try-catch异常处理
**************************** FATAL ERROR DETECTED ****************************
Error detected at line 36.
Error detected in file ../../../../lib_3rd/dlib-19.17/include/dlib/opencv/cv_image.h.
Error detected in function dlib::cv_image<pixel_type>::cv_image(cv::Mat) [with pixel_type = unsigned char].
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(): 3
img.pixel_traits<pixel_type>::num: 1
******************************************************************************
2)cv::Mat中像素按BGR格数存储,因此将mat转换成
dlib::matrix<dlib::bgr_pixel>
2、代码
//根据cv::Mat::type()的类型,使用不同的type_pixel加载到dlib::cv_image,
//并转换成dlib::matrix<dlib::bgr_pixel>格式
int cvMat2dlib(dlib::matrix<dlib::bgr_pixel> &dest, const cv::Mat &src)
{
cv::Mat tmp;
switch (src.type()) {
case CV_8UC3:
dlib::assign_image(dest, dlib::cv_image<dlib::bgr_pixel>(src));
break;
case CV_8UC4:
tmp = src.clone();
cv::cvtColor(tmp, tmp, cv::COLOR_BGRA2RGBA);
dlib::assign_image(dest, dlib::cv_image<dlib::rgb_alpha_pixel>(tmp));
break;
case CV_8UC1:
dlib::assign_image(dest, dlib::cv_image<unsigned char>(src));
break;
default:
return GW_ERR_ARG;
break;
}
return GW_ERR_OK;
}
三、dlib::rectangle和cv::Rect互转
cv::Rect:表示的矩形包含顶部和左边界,但是不包含右边界和底边界。
dlib::rectangle:表示的矩形包括所有边界,因此转换函数必须注意将右下角移动1。
// cv::Rect:表示的矩形包含顶部和左边界,但是不包含右边界和底边界。
//dlib::rectangle:表示的矩形包括所有边界,因此转换函数必须注意将右下角移动1。
cv::Rect dlibRect2cvRect(const dlib::rectangle &r)
{
return cv::Rect(cv::Point2i(r.left(), r.top()), cv::Point2i(r.right() + 1, r.bottom() + 1));
}
dlib::rectangle cvRect2dlibRect(const cv::Rect &r)
{
return dlib::rectangle((long)r.tl().x, (long)r.tl().y, (long)r.br().x - 1, (long)r.br().y - 1);
}