问题:opencv中imwrite()函数无法将图片输出,也不报错
文件路径对吗
不知道你这个问题是否已经解决, 如果还没有解决的话:#include<opencv2\opencv.hpp> //加载OpenCV4的头文件
#include<iostream>
using namespace std;
using namespace cv; //OpenCV命名空间
void AlphaMat(Mat &mat)
{
CV_Assert(mat.channels() == 4);
for (int i = 0; i < mat.rows; i++)
{
for(int j=0;j<mat.cols;j++)
{
Vec4b& bgra = mat.at<Vec4b>(i, j);
bgra[0] = UCHAR_MAX; //蓝色通道B
bgra[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols)*UCHAR_MAX); //绿色通道G
bgra[2] = saturate_cast<uchar>((float(mat.cols - i)) / ((float)mat.rows)*UCHAR_MAX); //红色通道R
bgra[3] = saturate_cast<uchar>(0.5*(bgra[1] + bgra[2])); //Alpha通道
}
}
}
int main()
{
Mat mat(480, 640, CV_8UC4);
AlphaMat(mat);
vector<int> compression_params;
compression_params.push_back(IMWRITE_PNG_COMPRESSION); //PNG格式图像压缩标志
compression_params.push_back(9); //设置最高压缩质量
bool result = imwrite("alpha.png", mat, compression_params);
if (!result)
{
cout << "保存成PNG格式图像失败" << endl;
return -1;
}
cout << "保存成功" << endl;
return 0; //程序结束
}
转换前与转换后成功保存的图像对比,4通道(Alpha通道)图像可以保存成PNG格式文件。
感谢阅读!也欢迎大家关注小白博主,多多鼓励一下!
答案:
根据参考资料中的段落0可以得知,imwrite()函数的参数中第一个参数是需要写入的文件名字,需要加后缀如"img.jpg";第二个参数是一般填一个Mat类型的图像数据;第三个参数是特定格式保存的参数编码,一般情况不需要填写。
参考资料中的段落2表示,第三个参数有JPEG、PNG、BMP等格式可以选择,并改变了输出格式,把JPEG改为PNG格式且添加了参数:
param.push_back(CV_IMWRITE_PNG_COMPRESSION);
param.push_back(9);
其中,第一个参数表示压缩级别,0-9之间,数值越大质量越高。第二个参数是设置保存图片数据的类型,这里是PNG格式。
因此,本问题的解决方案为:
1.检查文件名是否正确,并且为图片格式。
2.检查输入的图像数据是否正确。
3.尝试改变输出格式,如将JPEG改为PNG,并尝试添加一些特定格式保存的参数编码,可以提高图像质量。
具体实现可以参考参考资料中的段落2中的代码:
cv::imwrite("test.png", image, param);
或者参考参考资料中的段落7:
cv2.imwrite("out.png", image)