Mat的类型
最新做项目,要将数组中的数字写入到opencv的Mat中保存成图像。想要单通道的图像,那就申请一个Mat类型的数组,然后往里面赋值就好了。
Mat mat_=Mat::zeros(Size(width,height),CV_8UC1);
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
mat_<int>(i,j)=value;
}
本以为这样就好了,但是一直得不到正确的图像。反复看程序没有发现错误,后来,终于发现就是赋值这里错了。应该是下面这种写法:
Mat mat_=Mat::zeros(Size(width,height),CV_8UC1);
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
mat_<uchar>(i,j)=value;
}
在给三通道图像赋值的时候,
mat_.at<Vec3b>(i,j)[0]=value;
mat_.at<Vec3b>(i,j)[1]=value;
mat_.at<Vec3b>(i,j)[2]=value;
opencv读取图像
opencv读取图像使用imread函数。
image=imread("img_path");
不管是单通道图像还是双通道图像,这样读进来都是三通道图像。要想读进来还是单通道,要这样使用:
image=imread("img_path",-1)
保存图片
opencv保存图片的函数是imwrite()。
imwrite("image.jpg",image);
对于JPEG格式的图片,这个参数表示从0-100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.
对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0-9.较高的值意味着更小的尺寸和更长的压缩时间而默认值是3.
对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值为1.
可以改变其质量因子,
vector<int>compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); //JPG格式图片的压缩级别
compression_params.push_back(100);
try
{
imwrite("image.JPG", image, compression_params);
}
但是如果想要无损失,还是保存成PNG好了,因为这个是无损压缩。