OPENCV关于图像处理的基本库函数小结

1> Mat img1(3,5,CV_32F); //创建一个具有32位浮点数的3 x 5单通道数组
   Mat img2(23,53,CV_64FC(5)); //创建一个带有64位浮点数的23 x 53 5通道数组
   Mat img3(Size(100,200),CV_16UC2); // 100 x 200具有16位无符号整数的2通道数组
   尽管CV_32FC4是有效的数据类型,但CV_32FC5不是有效的数据类型。 对于由多于4个通道组成的阵列,应该使用括号来包围    通道号。 例如 -    CV_32FC(5)。一些OpenCV函数只能处理上述数据类型的子集。


2> Mat image(600, 800, CV_8UC3, Scalar(100, 250, 30)); 
   它创建一个600像素高,800像素宽的图像。 为图像中的每个像素分配24位。 24位将由三个无符号8位整数组成,分别代表蓝色,绿色和红色     平面。 三个整数的值应为0到255。然后,此构造函数使用3个无符号整数(100,250,30)初始化所创建图像的每个像素。 因此,它用100,     绿色通道250和红色通道30初始化蓝色通道。因为绿色通道的值明显大于其他通道的值,输出图像是绿色的。


3> bool VideoCapture :: set(int propId,double value)
   可以使用VideoCapture :: set函数更改VideoCapture对象的某些属性。 对于支持的属性,此函数将返回true。 否则它将返回false。
   propID - 要更改的VideoCapture对象的属性。 可以改变的最常见属性是
   CAP_PROP_POS_MSEC - 视频文件的当前位置(以毫秒为单位)
   CAP_PROP_POS_FRAMES - 接下来要捕获的帧的相对位置(从0开始,例如 - 0,1,2,3 ......)
   value - 指定属性的新值


4> bool imwrite(const String&filename,InputArray img,const std :: vector&params = std :: vector())
   此函数将给定的img对象写入指定的文件。成功时,此函数将返回true,否则返回false。
   filename - 输出图像的文件名。请注意,文件名的扩展名将用于确定图像格式。 (例如 - 如果文件名是MyImage.jpg,则会写入JPEG图像     。如果文件名是MyImage.png,则会写入PNG图像。)。始终支持jpeg,jpg,bmp,png,tiff和tif扩展名。支持其他映像文件类型,具体取     决于您的平台和已安装的编解码器。
   img - 要保存的图像对象。请注意,此图像对象应具有以下属性。
   图像对象的位深度应为8位有符号或16位无符号。
   图像的通道数应为1或3.对于3通道图像对象,应存在BGR通道顺序。
   如果图像对象的位深度或通道顺序与上述规范不同,则可以使用Mat :: convertTo和cv :: cvtColor函数转换图像。
   params - 这是一个可选参数。


5> VideoWriter(const String&filename,int fourcc,double fps,Size frameSize,bool isColor = true)
   这是VideoWriter对象的可用重载构造函数之一。 它构造并初始化VideoWriter对象,以便将视频帧写入给定文件。
   filename - 要写入视频帧的文件的名称。
   用于压缩视频的编解码器的4密码 - 4字符代码。 完整的代码列表可在此页面中找到。 但是,此页面中列出的大多数编解码器可能无法在您     的计算机中运行。 这些是一些可能适合您的流行编解码器。
   用于MPEG-1的VideoWriter :: fourcc('P','I','M','1')
   适用于Motion JPEG的VideoWriter :: fourcc('M','J','P','G')
   VideoWriter :: fourcc('M','P','4','2')用于Microsoft的MPEG-4变体
   fps - 写入视频流的每秒帧数。
   frameSize - 写入此视频流的视频帧的大小
   isColor - 始终将true传递给此参数


6> void Mat :: convertTo(OutputArray m,int rtype,double alpha = 1,double beta = 0)const
   此函数将每个像素值转换为目标数据类型,并根据以下公式更改值。
   pixel_value_of_output_image(x,y)= pixel_value_of_input_image(x,y)* alpha + beta;
   m - 输出图像。如果需要,将重新分配此数据结构。
   rtype - 输出图像的类型。如果rtype为负值,则输出图像的类型将与输入图像相同。
   alpha - 在分配到输出图像之前,输入图像中的每个像素将乘以此数字。
   beta - 此值将添加到输入图像中的每个像素并分配给输出图像。


7> equalizeHist(image, hist_equalized_image); 直方图均衡库函数
   上述函数均衡灰度图像的直方图,并将输出存储在hist_equalized_image中。


8> Mat image_blurred_with_3x3_kernel;
   blur(image,image_blurred_with_3x3_kernel,Size(3,3));
   上述功能在原始图像上使用3 x 3标准化盒式滤镜执行均匀平滑/模糊操作,并将平滑后的图像存储在image_blurred_with_3x3_kernel Ma对    象中。 原始图像中的每个通道都是独立处理的。


9> 高斯模糊
   Mat image_blurred_with_3x3_kernel;
   GaussianBlur(image,image_blurred_with_3x3_kernel,Size(3,3),0);
   上述函数在原始图像上使用3×3高斯滤波器执行高斯模糊/平滑操作,并将平滑后的图像存储在image_blurred_with_3x3_kernel Mat对象中     。原始图像中的每个通道都是独立处理的。内核的宽度和高度应该是奇数。将基于内核的大小来计算高斯分布的X方向和Y方向上的标准偏差。


10> cvNot(img,img)
    该函数反转第一个参数中图像的每个元素中的每个位,并将结果放在第二个参数的图像中。
    此功能可以处理图像。 这意味着相同的变量可用于第一和第二参数。
    例如 - 对于8位图像,值0将映射到(255-0)= 255,值46将映射到(255-46)= 209。


11> 侵蚀处理
    Mat image_eroded_with_3x3_kernel;
    erode(image,image_eroded_with_3x3_kernel,getStructuringElement(MORPH_RECT,Size(3,3)));
    erode()函数使用指定的内核侵蚀图像,该内核确定采用最小值的像素的邻域。 getStructuringElement(MORPH_RECT,Size(3,3))      函数用于获取大小为3 x 3的矩形内核,用于此形态操作。 结果图像存储在image_eroded_with_3x3_kernel中。 如果图像包含多个通道(      彩色图像有3或4个通道),则每个通道都是独立处理的。


12> 膨胀图像
    cvDilate(img,img,0,2)
    第一个参数是源图像。
    第二参数是要作为扩张图像的目标图像。
    这里第3个参数是用于扩张的结构元素。如果它是0,则使用3×3矩形结构元素。
    第4个参数是应用膨胀的次数。
    此功能可以处理图像。这意味着相同的变量可用于第一和第二参数。


13> 增加轨迹栏
    int createTrackbar(const string&trackbarname,const string&winname,int * value,int count,TrackbarCallback            onChange = 0,void * userdata = 0)
    此OpenCV函数创建一个轨迹栏并将该轨迹栏附加到指定的窗口
    trackbarname - 轨迹栏的名称
    winname - 跟踪栏所连接的窗口的名称
    value - 此指针指向的整数保存与轨迹栏位置关联的值
    count - 轨迹栏的最大值。最小值始终为零。
    onChange - 每次更改轨迹栏的位置时都会调用此函数。该函数的原型应为“FunctionName(int,void *)”。 “int”值是与轨迹栏位置     关联的值。并且“void *”是您作为“userdata”传递的任何指针值(请参阅下一个参数)。
    userdata - 此指针变量将作为上述函数的第二个参数传递
    使用了2个回调函数; “亮度”轨迹栏的“MyCallbackForBrightness(int,void *)”和“对比度”轨迹栏的“MyCallbackForContrast     (int,void *)”。
    使用了全局变量src,因为它应该从所有3种方法中访问。
    仔细检查“main”方法中“createTrackbar”方法的第5和第6个参数。
    每当“亮度”轨迹栏的位置发生变化时,将调用“MyCallbackForBrightness(int,void *)”。第一个整数参数保存“亮度”轨迹栏的位     置值。 “对比度”轨迹栏的位置作为第二个参数传递。 (观察第5和第6个参数; createTrackbar(“亮度”,“我的窗口”,&             iValueForBrightness,100,MyCallbackForBrightness和iValueForContrast);)
    每当“对比度”轨迹栏的位置发生变化时,将调用“MyCallbackForContrast(int,void *)”。第一个整数参数保存“对比度”轨迹栏位     置的值。 “亮度”轨迹栏的位置作为第二个参数传递。 (观察第5和第6个参数; createTrackbar(“对比度”,“我的窗口”,&           iValueForContrast,100,MyCallbackForContrast和iValueForBrightness))


14> 检测鼠标的单击与移动
    void setMouseCallback(const string&winname,MouseCallback onMouse,void * userdata = 0)
    此函数设置每次在指定窗口中发生任何鼠标事件时调用的回调函数。以下是上述OpenCV功能的各个参数的详细说明。
    winname - OpenCV窗口的名称。将注册与此窗口相关的所有鼠标事件
    onMouse - 回调函数的名称。每当发生与上述窗口相关的鼠标事件时,将调用此回调函数。此功能应具有如下签名
    void FunctionName(int event,int x,int y,int flags,void * userdata)
    event - 鼠标事件的类型。这些是鼠标事件的完整列表
    EVENT_MOUSEMOVE
    EVENT_LBUTTONDOWN
    EVENT_RBUTTONDOWN
    EVENT_MBUTTONDOWN
    EVENT_LBUTTONUP
    EVENT_RBUTTONUP
    EVENT_MBUTTONUP
    EVENT_LBUTTONDBLCLK
    EVENT_RBUTTONDBLCLK
    EVENT_MBUTTONDBLCLK
    x - 鼠标事件的x坐标
    y - 鼠标事件的y坐标
    flags - 鼠标事件发生时的特定条件。有关此参数的用法,请参阅下一个OpenCV示例代码。以下是“标志”所包含的整个枚举值列表
    EVENT_FLAG_LBUTTON
    EVENT_FLAG_RBUTTON
    EVENT_FLAG_MBUTTON
    EVENT_FLAG_CTRLKEY
    EVENT_FLAG_SHIFTKEY
    EVENT_FLAG_ALTKEY
    userdata - 任何指针作为第3个参数传递给“setMouseCallback”函数(见下文)
    userdata - 此指针将传递给回调函数


15> 使用轨迹栏旋转图像
    1)Mat getRotationMatrix2D(Point2f中心,双角,双刻度) ---此函数返回2D旋转的2x3仿射变换矩阵。
论点 - 
    center - 源图像旋转的中心。
    angle - 以度为单位的旋转角度(逆时针方向为正值,顺时针方向为负值)
    scale - 图像的缩放系数。 (缩放因子为1表示其原始大小)
    尝试不同的中心,角度和比例值,并观察输出图像。
    2)void warpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize,int flags = INTER_LINEAR,int           bordreMode = BORDER_CONSTANT,const Scalar&borderValue = Scalar())----此OpenCV函数将仿射变换应用于图像。
论点 - 
src - 源图像
dst - 目标图像应与源图像具有相同的类型(转换后的图像存储在此位置)
M - 2x3仿射变换矩阵
dsize - 目标图像的大小
flags - 插值方法
borderMode - 像素外推法。 (尝试这些值; BORDER_REPLICATE,BORDER_CONSTANT,BORDER_REFLECT,BORDER_WRAP,             BORDER_REFLECT_101,BORDER_TRANSPARENT和BORDER_ISOLATED)
borderValue - 如果对borderMode使用BORDER_CONSTANT,则此参数定义用于边框的值


16> 颜色检测及对象跟踪
    通常,人们可以认为BGR颜色空间更适合基于颜色的分割。但HSV色彩空间是用于基于颜色的图像分割的最合适的色彩空间。因此,在上述应    用中,我已将视频原始图像的色彩空间从BGR转换为HSV图像。
    HSV颜色空间也由3个矩阵组成,HUE,SATURATION和VALUE。在OpenCV中,HUE,SATURATION和VALUE的值范围分别为0-179,0-255和0-255。     HUE表示颜色,SATURATION表示相应颜色与白色混合的量,VALUE表示相应颜色与黑色混合的量。
    在上面的申请中,我认为红色物体的HUE,SATURATION和VALUE分别在170-180,160-255,60-255之间。这里HUE对于该对象的特定颜色分布是    唯一的。但是,饱和度和值可能会根据该环境的照明条件而变化。
1)基本颜色的色调值
  橙色0-22
  黄22-38
  绿色38-75
  蓝色75-130
  紫罗兰130-160
  红色160-179
  这些是近似值。您必须根据对象的颜色找到HUE值的确切范围。
2)void inRange(InputArray src,InputArray lowerb,InputArray upperb,OutputArray dst);
  检查'src'的每个元素是否位于'lowerb'和'upperb'之间。如果是,则'dst'的相应位置被指定为'255',否则被指定为'0'。 (值     为255的像素显示为白色,而值为0的像素显示为黑色) 
InputArray src - 源图像
InputArray lowerb - 包含的下边界(如果lowerb =标量(x,y,z),分别具有低于x,y和z的HUE,SATURATION和VALUE的 像素被认为是dst图像中的黑色像素)
InputArray upperb - 独占上边界(如果它是upperb =标量(x,y,z),分别具有大于或等于x,y和z的HUE,SATURATION 和VALUE的像素被视为dst图像中的黑色像素)
OutputArray dst - 目标图像(应该与src图像具有相同的大小,应该是8位无符号整数,CV_8U)
3)void erode(InputArray src,OutputArray dst,InputArray kernel,Point anchor = Point(-1,-1),int iterations     =1,int borderType = BORDER_CONSTANT,const Scalar&borderValue = morphologyDefaultBorderValue())
  此功能侵蚀源图像并将结果存储在目标图像中。支持就地处理。 (这意味着您可以对源图像和目标图像使用相同的变量)。如果源     图像是多通道,则独立处理所有通道,并将结果作为单独的通道存储在目标图像中。
  InputArray src - 源图像
OutputArray dst - 目标图像(应与源图像具有相同的大小和类型)
InputArray kernel - 用于侵蚀源图像的结构元素点锚点 - 锚点在内核中的位置。如果是Point(-1,-1),则将内核的中    心作为锚点的位置
int iterations - 应用侵蚀的次数
int borderType - 边界条件中的像素外推方法
const Scalar&borderValue - 如果borderType = BORDER_CONSTANT,则边界条件中像素的值
4)void dilate(InputArray src,OutputArray dst,InputArray kernel,Point anchor = Point(-1,-1),int iterations   = 1,int borderType = BORDER_CONSTANT,const Scalar&borderValue = morphologyDefaultBorderValue());
  此功能扩大源图像并将结果存储在目标图像中。支持就地处理。 (这意味着您可以对源图像和目标图像使用相同的变量)。如果源   图像是多通道,则独立处理所有通道,并将结果作为单独的通道存储在目标图像中。
InputArray src - 源图像
OutputArray dst - 目标图像(应具有与源图像相同的大小和类型)
InputArray kernel - 用于扩展源图像的结构元素点锚点 - 锚点在内核中的位置。如果是Point(-1,-1),则将内核的中    心作为锚点的位置
int iterations - 应用膨胀的次数
int borderType - 边界条件中的像素外推方法
const Scalar&borderValue - 如果borderType = BORDER_CONSTANT,则边界条件中像素的值
5)void cvtColor(InputArray src,OutputArray dst,int code,int dstCn = 0)
  此功能将源图像从一个颜色空间转换为另一个颜色空间。支持就地处理。 (这意味着您可以对源图像和目标图像使用相同的变量)
InputArray src - 源图像
OutputArray dst - 目标图像(应具有与源图像相同的大小和深度)
int code - 颜色空间转换代码(例如COLOR_BGR2HSV,COLOR_RGB2HSV,COLOR_BGR2GRAY,COLOR_BGR2YCrCb,   COLOR_BGR2BGRA等)
int dstCn - 目标映像中的通道数。如果为0,则从源图像和颜色转换代码自动导出通道数。


17> Scalar的定义:
    typedef struct Scalar
    {
        double val[4];
    }Scalar;
    可以看到,Scalar是一个由长度为4的数组作为元素构成的结构体,Scalar最多可以存储四个值,没有提供的值默认是0。

猜你喜欢

转载自blog.csdn.net/qq_41712955/article/details/80993068