利用Qt解决Opencv保存图片路径含中文情况下无图片保存的问题
问题:
如下代码所示,当使用opencv的imwrite函数时,给的路径不能含有中文,否则没有图片保存。
QString path = m_savePath + "/RefPointsMarker.png";
imwrite(path.toStdString(), img);//路径含有中文不会保存图片
解决方法:
将Mat类型转化为QImage,然后利用QImage::save()函数保存图片即可。以下为Mat类型转QImage的代码。
QImage MatToQImage(const cv::Mat& mat)
{
// 8-bits unsigned, NO. OF CHANNELS = 1
if (mat.type() == CV_8UC1)
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
// Set the color table (used to translate colour indexes to qRgb values)
image.setColorCount(256);//image.setNumColors(256);
for (int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
// Copy input Mat
uchar *pSrc = mat.data;
for (int row = 0; row < mat.rows; row++)
{
uchar *pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
}
// 8-bits unsigned, NO. OF CHANNELS = 3
else if (mat.type() == CV_8UC3)
{
// Copy input Mat
const uchar *pSrc = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
return image.rgbSwapped();
}
else if (mat.type() == CV_8UC4)
{
// Copy input Mat
const uchar *pSrc = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
return image.copy();
}
else {
return QImage();
}
}
之后就是函数调用的问题了:
QImage saveImg = MatToQImage(img);
saveImg.save(path);
其中img为处理后的Mat对象。
最后附上QImage转Mat的代码:
cv::Mat FileSave::QImageToMat(unsigned char** pImgdata, int width, int height, int band)
{
cv::Mat Img;
if (band == 1) //灰度图
Img.create(height, width, CV_8UC1);
else //彩色图
Img.create(height, width, CV_8UC3);
for (int i = 0; i < height; i++) //行数--高度
{
unsigned char* data = Img.ptr<unsigned char>(i); //指向第i行的数据
for (int j = 0; j < width; j++) //列数 -- 宽度
{
for (int m = 0; m < band; m++) //将各个波段的数据存入数组
data[j*band + m] = pImgdata[m][i*width + j];
}
}
return Img;
}