1.输入显示
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int main( ){
Mat srcImage=imread("pic.jpg",2|4);//第二个参数>0返回一个3通道的彩色图像;=0返回灰度图像(可自行转化);<0返回包含Alpha通道的加载图像;2|4载入无损的源图像
//若以彩色模式载入图像,解码后会以BGR的通道顺序进行存储,而不是通常的RGB顺序,自带默认值为1
//namedWindow("dog",1);//创建窗口,同OpenCV1,即下行代码,第二个还可以为WINDOW_OPENGL从而支持OpenGL(广泛接纳的2D/3D图形API)
//cvNamedWindow("Example1",0);
imshow("dog",srcImage);//若窗口第二个参数不是1则进行缩放,而imshow缩放图像取决于图像的深度,若是简单显示可以省略上述窗口的命名,但在显示之前要使用窗口则需在前面定义
waitKey(0);
destroyWindow("dog");//事实上,对于代码量不大的简单程序没必要手动调用以下函数,因为在退出时,所有资源和窗口会被操作系统自动关闭
destroyAllWindows();
}
2.imwrite()函数
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<vector>
using namespace cv;
using namespace std;
void createAlphaMat(Mat &mat){
for(int i=0;i<mat.rows;++i){
for(int j=0;j<mat.cols;++j){
Vec4b&rgba=mat.at<Vec4b>(i,j);
rgba[0]=UCHAR_MAX;//R分量最大,所以整体偏红
rgba[1]=saturate_cast<uchar>((float (mat.cols-j))/((float)mat.cols)*UCHAR_MAX);//uchar占一个字节0~255,最大可保存整型到255,saturate_cast()就是防止数据溢出
rgba[2]=saturate_cast<uchar>((float (mat.cols-i))/
((float)mat.rows)*UCHAR_MAX);
rgba[3]=saturate_cast<uchar>(0.5*(rgba[1]+rgba[2]));
}
}
}
int main( ){
Mat mat(480,640,CV_8UC4);//CV_8UC4--则可以创建-----8位无符号的四通道---带透明色的RGB图像
createAlphaMat(mat);
vector<int>compression_params;//声明一个int型向量
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);//push_back在vector类中作用为在vector尾部加入一个数据。
compression_params.push_back(9);
try{//try{}这不是一个函数,是一个语句块,如果加了try{}标识如果这一块语句有问题的话,任然可以通过编译,错误会被忽略,这是一套语句,还应该有捕捉的catch语句来捕捉异常。
imwrite("透明Alpha值图.png",mat,compression_params);//第一个参数,文件名需带后缀;第二个参数一般填一个Mat类型的图像数据;第三个参数,const vector<int>&类型的params,
//表示特定格式保存的参数编码,有默认值一般不需要填写,如需要:1.对于JPGA格式的图片,这个参数表示从0到100的图像质量(CV_IMWRITE_JPEG_QUALITY),默认值是95;2.对于PNG
//格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0到9.较高的值意味着更小的尺寸和更长的压缩时间,默认值是3;3.对于PPM,PGM或PBM格式的图片,这个参数
//表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,默认值是1;
imshow("生成的PNG图",mat);
fprintf(stdout,"PNG图片文件的alpha数据保存完毕~\n可以在工程目录下查看由imwrite函数生成的图片\n");//printf(...)=fprintf(stdout,...)
waitKey(0);}
catch(runtime_error& ex){//捕捉错误
fprintf(stderr,"图像转换为PNG格式发生错误:%s\n",ex.what());//stderr是无缓冲的,会直接输出;
//stdout -- 标准输出设备 (printf("..")) 同 stdout; stderr -- 标准错误输出设备,两者默认向屏幕输出;但如果用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。
return 1;
}
return 0;
}