目录
一,先将图片文件读取成比特流,再使用opencv中imdecode()函数将比特流解码成Mat图像
二,先将图片读取成QImage格式,再将QImage格式转换为Mat格式
问题描述:imread()函数不能识别Qt的路径命名规则
我的程序中有这样一段代码:
QString ctImgPath = "CT.jpg";//图片文件与主函数文件在同一个文件夹
Mat ctImg = imread(ctImgPath.toLatin1().data());
if(ctImg.empty ()){
qDebug("图像为空");
}
在debug模式下,使用Qt Creator打开,能正常读取。但是在release模式下,或者直接的debug文件夹中打开exe文件时,图像为空。
原因在于:Qt在编译之后,对图片文件进行了编码,原来的图片文件已经不见了:
编码成了cpp文件:
qrc_res.cpp文件内容:
所以不建议在Qt中使用传统的文件路径来引用文件,在Qt中有两种方式命名路径:
分别是:
:/XXX.jpg
qrc:/XXX.jpg
问题随之而来:
使用imread()函数并不能识别Qt的路径命名规则
解决办法
一,先将图片文件读取成比特流,再使用opencv中imdecode()函数将比特流解码成Mat图像
Mat ctImg;
QFile file(":/CT.jpg");
if(!file.open(QFile::ReadOnly))
{
qDebug("读取失败");
}else{
QByteArray ba = file.readAll();
ctImg = imdecode(vector<char>(ba.begin(), ba.end()), 1);
}
if(ctImg.empty ()){
qDebug("图像为空");
}
二,先将图片读取成QImage格式,再将QImage格式转换为Mat格式
转换方法参考:Qt QImage 与 OpenCV 的 Mat 类型的相互转化(改进),QImage与Mat之间的相互转换