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);
//显示图片,第一个参数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);
混合两张图片
根据上面的公式,可以对两张图片进行混合操作,其中***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);