[教程][Opencv][dlib]dlib和opencv的互转

4 篇文章 0 订阅
1 篇文章 0 订阅

一、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、注意事项
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互转

1、注意事项
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);
}

四、参考

【Dlib】dlib和opencv的互转
https://blog.csdn.net/u010168781/article/details/90523170



写于关雎


在这里插入图片描述


新浪微博:https://weibo.com/tianzhejia
CSDN博客:https://blog.csdn.net/qq_35605018
博客网站:http://www.zhijiadeboke.xyz
GitHub:https://github.com/ZhijiaTian
QQ邮箱:2461824656@qq.com
126邮箱:tianzhejia@126.com
Outlook邮箱:tianzhejia@outlook.com

以上均可与本人取得联系,欢迎探讨。^ v ^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>