opencv c++(2):图像处理常用方法详解

1 创建显示窗口

1.1 api介绍

要用到下面4个api
namedWindow(); //创建窗口
imshow(); //显示窗口
resizeWindow(); //重置窗口大小
destroyAllWindows(); //销毁窗口

我们在编程的一个很重要的步骤就是学会看api,可以不用看官网,直接在代码中点进去这个api会有详细的介绍。
比如我们使用vs2019,把鼠标放上去就会有这些api的介绍,然后Ctrl + 左键点进去就能看到这个api的更详细介绍(前提是opencv要装好)
在这里插入图片描述
opencv c++(2):图像处理常用方法详解_第1张图片
opencv c++(2):图像处理常用方法详解_第2张图片
下面就来简单介绍下常用的参数

//1. nameWindow
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
/*
winname:就是窗口的名字
flags:是一个枚举量,常用的是WINDOW_NORMAL,可以改变窗口大小,可以对窗口进行操作;
WINDOW_AUTOSIZE是根据你显示图片大小一致,无法去改变窗口大小
*/
//2. imshow
void imshow(const String& winname, InputArray mat);
/*
winname:如果namedWindow没有定义,则会自己创建一个WINDOW_AUTOSIZE的窗口
mat:就是一个mat型的对象,这里把mat型转换成了InputArray型,具体可查看相对应的api
*/
//3. resizeWindow
void resizeWindow(const String& winname, int width, int height);
void resizeWindow(const String& winname, const cv::Size& size);
/*
有两个重载
winname:就是需要重置窗口大小的那个窗口
width,height:对应窗口宽高
size:对应窗口宽高
*/
//4. waitKey
int waitKey(int delay = 0);
/*
delay: 延迟时间ms, 0则为阻塞,必须键盘有输入程序才会继续下去,也就是窗口一直显示
*/
//5. destroyAllWindows 销毁窗口
void destroyAllWindows();

1.2 示例

//源文件
#include

using namespace cv;
/*
nameWindow();
destroyAllWindows();
resizeWindow();
waitKey();
destroyAllWindows();
*/
int main()
{
	//定义mat
	Mat m(Size(256, 256),CV_8UC3, Scalar(0, 255, 0));
	//创建win1窗口
	namedWindow("win1", WINDOW_NORMAL);
	//将m显示在win1上
	imshow("win1", m);
	//自动创建win2窗口,将m显示在win2上
	imshow("win2", m);
	//resize win1窗口大小
	resizeWindow("win1", Size(512, 512));
	//阻塞
	waitKey(0);
	//销毁所有窗口
	destroyAllWindows();

}

opencv c++(2):图像处理常用方法详解_第3张图片

2 读图、保存图片

先来看一下api
imread(); //读图
imwrite(); //保存图片

//1. imread
Mat imread( const String& filename, int flags = IMREAD_COLOR );
/*
返回Mat 对象,默认是BGR色彩模式
filename:是文件路径
flags:是读图的模式,默认是RGB, IMREAD_COLOR; 常用的还有灰色图,IMREAD_GRAYSCALE; 
IMREAD_UNCHANGED 读取图像的所有通道,包括alpha通道(如果有的话),这种方式读取的图像可以包含RGB、灰度和alpha通道等;
其他有兴趣可以看ImreadModes这个枚举量里面有哪些值
*/

//2. imwrite
bool imwrite( const String& filename, InputArray img,
              const std::vector<int>& params = std::vector<int>());
/*
返回Mat 对象,默认是BGR色彩模式
filename:是保存的文件路径
img:是需要保存的Mat数据类型
params 是压缩形式,(paramId_1, paramValue_1, paramId_2, paramValue_2, ... .)。
这里如:
IMWRITE_JPEG_QUALITY,  < For JPEG, it can be a quality from 0 to 100 (the higher is the better). Default value is 95.
IMWRITE_PNG_BILEVEL,   < Binary level PNG, 0 or 1, default is 0.
具体枚举量的值介绍可查看 Imwrite flags这个枚举量
*/

3 常用对图片操作的方法

  1. cv::resize() 图像wh 放缩
resize( InputArray src, OutputArray dst,
                          Size dsize, double fx = 0, double fy = 0,
                          int interpolation = INTER_LINEAR );
/*
src:原图
dst:目标图片
dsize:目标图片的w,h,如果指定了fx,fy,则dsize应为cv::Size()空值,dsize和fx,fy只能指定一个
fx,fy:目标图片w=Wsrc*fx,h=Hsrc*fy,如果指定了dsize,则不能给fx,fy赋值。
interpolation :插值方法,默认线性插值INTER_LINEAR ,其他方法可看枚举量InterpolationFlags中的值介绍
*/
  1. cv::cvtColor() 图像色彩空间转换
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 )
/*
src:被转换的图
dst:转换成的目标图像
code:转换码,就是色彩空间转换标识,如code=COLOR_BGR2RGB,把BGR通道转换成RGB通道等,
其他的可以看enum ColorConversionCodes 里面的定义
dstCn:dst通道数,默认为0,根据src和code自动匹配,这里不需要改动,除非有特殊需求
*/
  1. cv::flip:对图像进行翻转操作,可以实现上下或左右翻转。
void flip(InputArray src, OutputArray dst, int flipCode);
/*
src:翻转前的图像
dst:翻转后的图像
flipCode: // >0: 垂直翻转沿y-轴翻转, 0: 水平沿x-轴翻转, <0: x、y轴同时翻转道等,
*/
  1. cv::GaussianBlur:对图像进行高斯模糊操作,可以去除图像中的噪声和细节。
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );
/*
src:模糊前的图;
dst:模糊后的图;
ksize:高斯模板的大小,只能为正奇数,原因后面讲;
sigmaX:X方向的标准差;
sigmaY :Y方向的标准差,等于0的时候,其值等于sigmaX;sigmaX、sigmaY都为0,
`sigma = 0.3*((ksize-1)*0.5 - 1) + 0.8` 这个在源码 Mat getGaussianKernel( int ksize, double sigma, int ktype = CV_64F )中有介绍;
borderType:边界填充方法,卷积核对边缘像素卷积时因此需要对边缘像素进行填充才能卷积,默认方法BORDER_DEFAULT,也就是镜像,
其他方法可看BorderTypes枚量中的介绍
*/
  1. cv::threshold:对图像进行二值化操作
// 对图像进行二值化操作
double threshold( InputArray src, OutputArray dst,
                               double thresh, double maxval, int type );
/*
src: 输入图像,可以是单通道或多通道图像,数据类型可以是CV_8UC1、CV_16UC1、CV_32FC1、CV_64FC1;
dst: 输出图像,与输入图像尺寸和数据类型相同;
thresh: 阈值,用于确定像素点的分类(前景或背景)。可以是任意实数,即使是负数也可以。如果使用OTSU自适应阈值,则可以将其设置为0;
double maxval: 当像素点的灰度值大于(或小于)阈值时,该像素点被分配为前景(或背景)像素。maxval是前景像素的值。可以是任意实数,即使是负数也可以;
type: 阈值类型,指定阈值的计算方法,可以是以下值之一:
   - THRESH_BINARY: 如果像素值大于阈值,则像素设置为maxval,否则像素设置为0。
   - THRESH_BINARY_INV: 如果像素值大于阈值,则像素设置为0,否则像素设置为maxval。
   - THRESH_TRUNC: 如果像素值大于阈值,则像素设置为阈值,否则像素保持不变。
   - THRESH_TOZERO: 如果像素值大于阈值,则像素保持不变,否则像素设置为0。
   - THRESH_TOZERO_INV: 如果像素值大于阈值,则像素设置为0,否则像素保持不变。
   - THRESH_MASK: 这个参数没给出解释和介绍,不知道是不是预留的
   - THRESH_OTSU: 使用OTSU自适应阈值来计算阈值。此时,thresh参数应设置为0;
   - THRESH_TRIANGLE: 使用Triangle算法计算阈值。
*/                                              
  1. cv::warpAffine:对图像进行仿射变换操作,可以实现平移、旋转、缩放等变换。
// 定义变换矩阵
Mat M = getRotationMatrix2D(cv::Point2f center, double angle, double scale);
// 对图像进行仿射变换
void warpAffine( InputArray src, OutputArray dst,
                              InputArray M, Size dsize,
                              int flags = INTER_LINEAR,
                              int borderMode = BORDER_CONSTANT,
                              const Scalar& borderValue = Scalar());;
/*
//1
getRotationMatrix2D 返回Mat对象,为2*3矩阵
center:变换中心点
angle:旋转角度
scale:放缩系数
//2
warpAffine
src: 输入的源图像,可以是Mat类型的对象或者是图像文件名。
dst: 输出的目标图像,必须是Mat类型的对象。
M: 变换矩阵,由getAffineTransform或者getPerspectiveTransform函数返回。可以是一个3x3的矩阵或者2x3的矩阵。
dsize: 目标图像的大小。
flags: 定义插值算法,可以是INTER_NEAREST、INTER_LINEAR、INTER_CUBIC、INTER_AREA、INTER_LANCZOS4中的一个。
borderMode: 定义边界处理方式,可以是BORDER_CONSTANT、BORDER_REPLICATE、BORDER_REFLECT、BORDER_WRAP、BORDER_REFLECT_101中的一个,可参考BorderTypes枚举量
borderValue: 当边界处理方式为BORDER_CONSTANT时,指定边界填充的像素值。默认为黑色(0,0,0)。
*/                               

你可能感兴趣的:(opencv,c++,图像处理,计算机视觉)