Opencv基础操作

图片基本操作

//读取图片,这里有两个参数,第一个是图片的路径,第二个是一个枚举类型可以为以下取值,默认是IMREAD_UNCHANGED,也就是保持原图像的格式,返回值为Mat类型
Mat image=imread(const String & 	filename,int flags =IMREAD_COLOR )
//还有类似的函数可以从内存读入一个图片
Mat image=imdecode(const String & 	filename,int flags =IMREAD_COLOR )
//下面这个成员函数可以检查是否读取到图片,
if(image.empty())
	std::cout<<"Error loading image"<<std::endl;
//采用下面这个函数可以将读入的图片转换为灰度图
cvtColor(image, grey, COLOR_BGR2GRAY);
//这个函数可以转换图像矩阵中的像素值类型,下面是将其转换为32位float类型
src.convertTo(dst, CV_32F);

java opencv读取图片文件 opencv读取图片函数_插值

//显示图片,第一个参数char类型是图片标题,第二个是要显示的图片是Mat类型
imshow(const String & 	winname,		InputArray 	mat )
//保存图片
imwrite	(	const String & 	filename,
InputArray 	img,
const std::vector< int > & 	params = std::vector< int >() 
)	//第一个参数是保存的路径,第二个是要保存的Mat对象,第三个是保存为不同格式时的不同编码例如保存为JPEG格式时,该值为CV_IMERITE_JPEG_QULITY,取值范围是0-100,即保存图片的质量,默认是95。如果是PNG类型,则表示是CV_IMWRITE_PNG_COMPRESSION,范围是0-9,默认是3,较大的值意味着更长的压缩时间和更小的尺寸
/*将图像保存到指定文件。图像格式是根据文件扩展名选择的.
通常,使用此功能只能保存 8 位单通道或 3 通道(具有“BGR”通道顺序)图像。
可以保存的具体格式如下:
Windows 位图 - *.bmp、*.dib
JPEG 文件 - *.jpeg、*.jpg、*.jpe
JPEG 2000 文件 - *.jp2
便携式网络图形 - *.png
WebP - *.webp
便携式图像格式 - *.pbm、*.pgm、*.ppm *.pxm、*.pnm
PFM 文件 - *.pfm
太阳栅格 - *.sr、*.ras
TIFF 文件 - *.tiff、*.tif
OpenEXR 图像文件 - *.exr
Radiance HDR - *.hdr、*.pic
GDAL 支持的栅格和矢量地理空间数据
*///还有向内存写入图片,第三个参数是要写入的内存缓冲区
bool cv::imencode	(	const String & 	ext,
InputArray 	img,
std::vector< uchar > & 	buf,
const std::vector< int > & 	params = std::vector< int >() 
)	
//获取图像某点的强度,可以对其进行修改什么的-单通道
 Scalar intensity = img.at<uchar>(y, x);
 Scalar intensity = img.at<uchar>(Point(x, y));
 //3通道-数据类型为unsigned char
 Vec3b intensity = img.at<Vec3b>(y, x);
 uchar blue = intensity.val[0];
 uchar green = intensity.val[1];
 uchar red = intensity.val[2];
 3通道-数据类型为float
 Vec3f intensity = img.at<Vec3f>(y, x);
 uchar blue = intensity.val[0];
 uchar green = intensity.val[1];
 uchar red = intensity.val[2];

 //获取图像某一区域
  Rect r(10, 10, 100, 100);
  Mat smallImg = img(r);

混合两张图片

java opencv读取图片文件 opencv读取图片函数_java opencv读取图片文件_02


根据上面的公式,可以对两张图片进行混合操作,其中***g(x)***是混合后的图像,等式右边分别是占有不同权重的两幅输入图片,两张图片的大小必须相同

//先将两幅图片设置为相同大小,src是原图像,dst是设置后的图像,Size和fx、fy都用来指定设置后的图像的大小,Size和fx、fy不能同时为零,如果size为零,则最后的大小为Size(round(fx*src.cols), round(fy*src.rows)),round()函数对结果四舍五入,返回最接近的整数值。最后的参数是插值方式,INTER_NEAREST表示最近邻插值,INTER_LINEAR表示双线性插值,INTER_CUBIC表示双三次插值
缩小图像,使用 INTER_AREA 插值通常看起来最好,而放大图像,通常使用 c::INTER_CUBIC(慢)或 INTER_LINEAR(更快但看起来还可以)看起来最好。
void cv::resize	(InputArray src,OutputArray dst,Size dsize,double fx = 0,double fy = 0,int interpolation =INTER_LINEAR )	
//设置为dst的大小
void resize(src, dst, dst.size(), 0, 0, interpolation);
//在进行混合alpha和beta分别为权重,第四个参数为gamma矫正系数,默认设为0,dst是输出图片
void addWeighted( src1, alpha, src2, beta, 0.0, dst);