OpenCV 的 Mat 在读取中文路径下图片时,会出现读取不到图片,可以通过 Qt 的 QImage 进行转换:
Mat cvReadImage(QString path)
{
QFile file(path);
if(!file.exists())
return Mat();
file.open(QIODevice::ReadOnly);
QByteArray data=file.readAll();
file.close();
QImage img=QImage::fromData(data);
img=img.convertToFormat(QImage::Format_RGB888);
return cvQImageToMat(img);
}
Mat cvQImageToMat(QImage qImage)
{
if(qImage.isNull())
return Mat();
int h=qImage.height();
int w=qImage.width();
Mat image=Mat();
switch(qImage.format())
{
case QImage::Format_Indexed8:
{
image=Mat(h, w, CV_8UC1, (void*)qImage.constBits(), qImage.bytesPerLine());
break;
}
case QImage::Format_RGB888:
{
Mat cImage=Mat(h, w, CV_8UC3, (void*)qImage.constBits(), qImage.bytesPerLine());
cv::cvtColor(cImage, image, CV_RGB2BGR);
break;
}
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
{
Mat cImage=Mat(h, w, CV_8UC4, (void*)qImage.constBits(), qImage.bytesPerLine());
cv::cvtColor(cImage, image, CV_RGBA2BGRA);
break;
}
default:
break;
}
return image;
}