OpenCV函数大全(超级详细版)-python操作_opencv python 函数

  • 显示图像的窗口名称,以字符串类型表示
  • 要加载的图像
  • 注意:在调用显示图像的API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。

    cv.imshow('image',img) #opencv中显示
    cv.waitKey(0) #等待窗口
    

    运行结果:

    1.3 图像的保存
    cv.imwrite()
    
    

    参数:

  • 文件名,要保存在哪里
  • 要保存的图像
  • cv.imwrite('genggui.png',img)
    
    

    案例:

    import cv2 as cv 
    
    img = cv.imread('genggui.jpg',0) #以灰度图的形式读取图像
    
    cv.imshow('image',img) # opencv中显示
    cv.waitKey(0)
    
    cv.imwrite('gengguigray.png',img) #保存所生成的灰度图像
    
    
    
    1.4 创建与关闭窗口

    创建窗口

    cv2.namedWindow(窗口名称, 属性) #创建一个窗口
    

    关闭图像窗口

    1.关闭一个由imshow产生的图像窗口

    cv2.destroyWindow()
    

    参数:winname,关闭的窗口名字

    2.关闭所有由imshow产生的窗口

    cv2.destroyAllWindows()
    

    2.绘制几何图形

    关键函数:

  • 线:line()
  • 矩形:rectangle()
  • 圆:circle()
  • 添加文字:putText()
  • 2.1 绘制直线
    cv.line(img,start,end,color,thickness)
    
    

    参数:

  • img:要绘制直线的图像
  • Start,end: 直线的起点和终点
  • color: 线条的颜色
  • Thickness: 线条宽度
  • 2.2 绘制圆形
    cv.circle(img,centerpoint, r, color, thickness)
    
    

    参数:

  • img:要绘制圆形的图像
  • Centerpoint, r: 圆心和半径
  • color: 线条的颜色
  • Thickness: 线条宽度,为-1时生成闭合图案并填充颜色
  • 2.3 绘制矩形
    cv.rectangle(img,leftupper,rightdown,color,thickness)
    

    参数:

  • img:要绘制矩形的图像
  • Leftupper, rightdown: 矩形的左上角和右下角坐标
  • color: 线条的颜色
  • Thickness: 线条宽度
  • 2.4 向图像中添加文字
    cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
    

    参数:

  • img: 图像
  • text:要写入的文本数据
  • station:文本的放置位置
  • font:字体
  • Fontsize :字体大小
  • 3.图像反转与复制

    3.1 翻转图像
    cv2.flip(img,flipcode)  #flipcode控制翻转效果
    
  • flipcode = 0:沿x轴翻转
  • flipcode > 0:沿y轴翻转
  • flipcode < 0:x,y轴同时翻转
  • 3.2 复制图像
    imgcopy = img.copy()
    

    4.获取图像的属性

    图像属性包括高、宽和通道数,像素数,图像数据类型等。

    img.shape  #打印图片的高、宽和通道数
    img.size   #打印图片的像素数目(图片大小)
    img.dtype  #打印图片的格式(数据类型)
    
    

    5.获取并修改图像中的像素点

    我们可以通过行和列的坐标值获取该像素点的像素值。对于BGR图像,它返回一个蓝,绿,红值的数组。对于灰度图像,仅返回相应的强度值。使用相同的方法对像素值进行修改。

    import cv2 as cv
    img = cv.imread('genggui.jpg') 
    px = img[100,100] #获取某个像素点的值
    blue = img[100,100,0] #仅获取蓝色通道的强度值
    img[100,100] = [255,255,255] #修改某个位置的像素值
    
    

    6.图像颜色通道的拆分与合并

    有时需要在B,G,R通道图像上单独工作。在这种情况下,需要将BGR图像分割为单个通道。或者在其他情况下,可能需要将这些单独的通道合并到BGR图像。

    6.1 将图片img拆分为三个颜色通道:
    cv2.split(img)  
    
    6.2 将三个颜色通道合并为一张图片:
    cv2.merge(img)
    

    7.色彩空间转换

    OpenCV中有150多种颜色空间转换方法。最广泛使用的转换方法有两种,BGR↔Gray和BGR↔HSV。

    cv.cvtColor(input_image,flag)
    
    

    参数:

  • input_image: 进行颜色空间转换的图像
  • flag: 转换类型
  • cv.COLOR_BGR2GRAY : BGR↔Gray
  • cv.COLOR_BGR2HSV: BGR→HSV
  • 更全的参数:

    7.1 BGR↔Gray
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #BGR转换到GRAY
    cv2.imshow("gray", gray)
    
    7.2 BGR↔HSV
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #BGR转换到HSV
    cv2.imshow("hsv", hsv)
    

    8.图像的加法与混合

    关键函数:

  • 相加:add()
  • 混合:addWeighted()
  • 8.1 图像的相加
    cv2.add(src1, src2) #参数为图片1与图片2
    
    8.2 图像的混合

    这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下:

    g(x) = (1−α)f0(x) + αf1(x)

    通过修改 α 的值(0 → 1),可以实现非常炫酷的混合,落到函数中为两个权重。

    cv2.addWeighted(src1, alpha, src2, beta,gamma,dst)
    

    参数:

  • src1:第一张图片
  • alpha:第一张图片权重
  • src2:第二张图片
  • gamma:图1与图2带权相加和后添加的数值(总和大于255为纯白)
  • dst:输出图片
  • 例子:第一幅图像的权重是0.7,第二幅图像的权重是0.3,使用cv2.addWeighted()函数进行混合

    img1=cv2.imread('1.jpg')
    img2=cv2.imread('2.jpg')
     
    dst=cv2.addWeighted(img1,0.7,img2,0.3,0)
    

    9. 图像的运算

    9.1 加、减、乘、除

    (加)

    cv2.add(src1, src2) #加
    

    (减)

    cv2.subtract(src1, src2) #减
    

    (乘)

    cv2.multiply(src1, src2) #乘
    

    (除)

    cv2.divide(src1, src2)
    
    9.2 均值、均值和方差

    均值

    cv2.mean(img) #均值
    

    均值和方差

     M1, dev1 = cv2.meanStdDev(img) #均值和方差
    
    
    9.3 与、或、非、异或 运算

    与运算

    dst = cv2.bitwise_and(src1, src2) #与
    cv2.imshow("bitwise_and", dst)
    

    或运算

    dst = cv2.bitwise_or(src1, src2) #或
    cv2.imshow("bitwise_or", dst)
    

    非运算(非运算就是对图像进行颜色反转)

    dst = cv2.bitwise_not(src1, src2) # 非(其实是颜色翻转)
    cv2.imshow("bitwise_not", dst)
    

    异或运算

    cv2.imshow(“bitwise_not”, dst)
    dst = cv2.bitwise_xor(src1, src2)
    

    10.图像的缩放,平移与旋转

    10.1 缩放 cv2.resize()
    cv2.resize(InputArray src, OutputArray dst, Size dsize,
    double fx=0, double fy=0, int interpolation=INTER_LINEAR )
    

    参数:

  • src : 输入图像
  • dsize: 绝对尺寸,直接指定调整后图像的大小
  • fx,fy: 相对尺寸,将dsize设置为None,然后将fx和fy设置为比例因子即可
  • interpolation:插值方法
  • 插值方法:(默认的插值方法为:双线性插值)

    10.2 平移 cv2.warpAffine()
    cv2.warpAffine(src,M,dsize)
    

    参数:

  • src : 输入图像
  • M: 移到矩阵
  • dsize: 输出图像
  • 10.3 旋转 cv2.getRotationMatrix2D()
    cv2.getRotationMatrix2D(center, angle, scale)
    

    参数:

  • center:旋转中心
  • angle:旋转角度
  • scale:缩放比例
  • 返回:M:旋转矩阵

    11.形态学处理函数

    11.1 腐蚀与膨胀

    1.腐蚀

    #腐蚀
    dst = cv2.erode( src, kernel, anchor, iterations, borderType, borderValue ) 
    
    

    参数:

  • dst:腐蚀后所输出图像,该图像和原始图像具有同样的类型和大小。

  • src:输入图像,图像的通道数可以是任意的。但是要求图像的类型必须是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F中的一种。

  • kernel:腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。

  • kernel = cv.getStructuringElement(cv.MORPH_RECT,(5, 5)) #矩形结构
    kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5, 5)) #椭圆结构
    kernel = cv.getStructuringElement(cv.MORPH_CROSS,(5, 5)) # 十字形结构
    
    
  • anchor代表element结构中锚点的位置。该值默认为(-1, -1),在核的中心位置。

  • terations是腐蚀操作迭代的次数,该值默认为1,即只进行一次腐蚀操作。

  • borderType代表边界样式,一般采用其默认值BORDER_CONSTANT。

  • 2.膨胀

    #膨胀
    dst = cv2.dilate( src, kernel, anchor, iterations, borderType, borderValue) 
    
  • 参数:kernel、anchor、iterations、borderType、borderValue与函数cv2.erode()内相应参数的含义一致。
  • 11.2 开操作与闭操作

    先腐蚀再膨胀的操作称为开运算。先膨胀再腐蚀的操作称为闭运算。

    cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel) #开操作
    cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel) #闭操作
    
    
    11.3 顶帽变换、底帽变换与形态学梯度(边界提取)

    1.图像减去开运算结果称为顶帽变换(Top-hat)。

    cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) #顶帽运算
    

    2.图像减去闭运算结果称为底帽变换(Bottom-hat)。

    cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) #底帽运算
    

    3.膨胀结果减去腐蚀结果,可以得到图像中物体的边界,是一种提取目标物体边缘的算法。

    cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel) #形态学梯度
    

    12.常见滤波器

    12.1 方框滤波
    cv2.boxFilter( src, dst,ddepth, ksize, Point anchor = Point(-1,-1),
                    bool normalize = true,borderType = BORDER_DEFAULT )
    

    参数:

  • src:输入图像

  • dst:输出图像

  • ddepth:输出图像的深度,-1 代表使用原图深度

  • ksize: 滤波内核的大小。一般这样写Size(w, h)来表示内核的大小,Size(10, 10)就表示 10×10 的核大小

  • anchor = Point(-1,-1) :表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1) 如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。

  • normalize = true:默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了

  • borderType = BORDER_DEFAULT:用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

  • 12.2 均值滤波
    cv2.blur(src, dst, ksize, Point anchor = Point(-1,-1),borderType = BORDER_DEFAULT)
    
  • src:输入图像 。
  • dst:输出图像 。
  • ksize:内核大小 ,一般用 Size(w,h),w 为宽度,h 为深度。
  • anchor:被平滑的点,表示取 内核中心 ,默认值 Point(-1,-1)。
  • boderType:推断图像外部像素的某种边界模式。默认值 BORDER_DEFAULT
  • 12.3 高斯滤波
    cv2.GaussianBlur(  src, dst, ksize,sigmaX, sigmaY = 0, borderType = BORDER_DEFAULT )
    
  • src:输入图像 。

  • dst:输出图像 。

  • ksize:ksize.width 和 ksize.height 可以不同,但他们都必须为正数和奇数,或者为0,可由 sigma 计算而来

  • sigmaX:高斯核函数在 X 方向的的标准差

  • sigmaY:高斯核函数在 Y 方向的的标准差

  • 若 sigmaY 为零,就将它设为 sigmaX;若 sigmaX 和 sigmaY 都是0,那么就由 ksize.width 和 ksize.height 计算出来.

    12.4 中值滤波
    medianBlur(InputArray src,OutputArray dst,int ksize)
    
  • src:输入图像 。
  • dst:输出图像 。
  • ksize:孔径的线性尺寸,这个参数必须是大于1 的奇数
  • 12.5 双边滤波
    bilateralFilter(src, dst, d, double sigmaColor,double sigmaSpace, 
                    borderType=BORDER_DEFAULT) 
    
  • src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。

  • dst: 输出图像,和原图像有相同的尺寸和类型。

  • d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。

  • sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。

  • sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.

  • borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.

  • 展示图像:

    13.轮廓检测

    13.1 找出图片的轮廓值
    cv2.findContours(img,mode, method)   # 找出图中的轮廓值,得到的轮廓值都是嵌套格式的
    

    参数:

  • img:输入的图片
  • mode:轮廓检索模式(通常都使用RETR_TREE找出所有的轮廓值)
  • RETR_EXTERNAL:只检索最外面的轮廓。
     RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中。
     RETR_CCOMP:检索所有的轮廓,并肩他们组织为两层:顶层为各部分外部边界,第二层是空洞的边界。
     RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。

  • method:轮廓逼近方法
  • CHAIN_APPROX_NONE: 以Freeman链码的方式输出轮廓,所有其它方法输出多边形。

    CHAIN_APPROX_SIMPLE: 压缩水平的、垂直的和斜着的部分,也就是函数只保留他们终点部分。

    13.2 画出图片中的轮廓值,也可以用来画轮廓的近似值
    cv2.drawCountours(img, contours, -1, (0, 0, 255), 2) # 画出图片中的轮廓值,也可以用来画轮廓的近似值
    

    参数:

  • img:输入的图片
  • contours:轮廓值(-1表示轮廓的索引,(0, 0, 255)表示颜色, 2表示线条粗细)
  • 轮廓检测与画图步骤:

    第一步:载入图片

    第二步:使用cv2.cvtcolor() 将图片转换为灰度图

    第三步:  使用cv2.threshold将图片做二值化转换

    第四步: 使用cv2.findContours 找出图片的轮廓值

    第五步:使用cv2.drawContours在图片上画上轮廓

    第六步:   使用cv2.imshow 完成画图操作

    13.3 计算轮廓的面积
    cv2.contourArea(cnt, True)  # 计算轮廓的面积
    

    参数说明:cnt为输入的单个轮廓值

    13.4计算轮廓的周长
    cv2.arcLength(cnt, True)   #  计算轮廓的周长
    

    参数说明:cnt为输入的单个轮廓值

    计算轮廓的周长和面积步骤:

    使用cv2.findCountor获得的轮廓contours是一个嵌套的类型,即我们可以通过cnt = contours获得第一个物体的轮廓值

    第一步:载入图片,做灰度值和二值化处理,并使用cv2.findCountor找出轮廓值,使用cv2.drawCountors画出第一个图像的轮廓

    第二步:通过索引取出第一个轮廓值cnt,使用cv2.ContourArea()计算轮廓的面积

    第三步:使用cv2.arcLength 获得轮廓的周长

    13.5 外接矩形

    使用cv2.boudingrect(cnt)获得轮廓的外接矩形,接着使用cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)画出矩阵的轮廓。

    1.获得外接矩形位置信息

    x, y, w, h = cv2.boudingrect(cnt) # 获得外接矩形
    

    参数说明:x,y, w, h 分别表示外接矩形的x轴和y轴的坐标,以及矩形的宽和高, cnt表示输入的轮廓值。

    2.根据坐标在图像上画出矩阵的轮廓

    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)  # 根据坐标在图像上画出矩形
    

    参数说明: img表示传入的图片, (x, y)表示左上角的位置, (x+w, y+h)表示加上右下角的位置,(0, 255, 0)表示颜色,2表示线条的粗细

    13.6 外接圆

    1.获得外接圆的位置信息

    (x, y), radius = cv2.minEnclosingCircle(cnt) # 获得外接圆的位置信息
    

    参数说明: (x, y)表示外接圆的圆心,radius表示外接圆的半径, cnt表示输入的轮廓

    2. 根据坐标在图上画出圆

    cv2.Cricle(img, center, radius, (0, 255, 0), 2)  # 根据坐标在图上画出圆
    

    参数说明:img表示需要画的图片,center表示圆的中心点,radius表示圆的半径, (0, 255, 0)表示颜色, 2表示线条的粗细

    画出外接矩形和外接圆步骤:

    外接矩形: 使用cv2.boudingrect(cnt)获得轮廓的外接矩形,使用cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)画出矩阵的轮廓

    外接圆: 使用cv2.minEnclosingCircle(cnt)获得轮廓的外接圆,使用cv2.circle(ret, centers, radius, (0, 0, 255), 2)画出圆的轮廓

    第一步:载入图片,灰度化,二值化,使用cv2.findCountors找出图像的轮廓,使用轮廓索引获得第一个轮廓cnt

    第二步:使用cv2.boundingrect(cnt) ,获得轮廓的x,y,w, h (x, y)表示左上角的坐标,w为宽,h为长

    第三步: 使用cv2.rectangle 绘制外接的轮廓

    第四步: 使用cv2.minEnclosingCircle(cnt), 获得center和radius,即圆心点的坐标和圆的半径

    第五步: 使用cv2.circle(img, center, radius, (0, 0, 255), 2) 绘制圆心的外接轮廓

    14.图像金字塔(上采样和下采样)

    1. 下采样:图像缩小(先高斯模糊,再降采样,需要一次次重复,不能一次到底)
    cv.pyrUP(img) #对图像进行上采样
    
    1. 上采样图像扩大(先扩大,再卷积或者使用拉普拉斯金字塔)
    cv.pyrDown(img)#对图像进行下采样
    
    

    15.边界填充

    cv2.copyMakeBorder(img,top, bottom, left, right ,borderType)
    

    参数:

  • img:需要填充的图像;
  • top:图像上边界需要填充的像素点;
  • bottom:图像下边界需要填充的像素点;
  • left:图像左边界需要填充的像素点;
  • right:图像右边界需要填充的像素点;
  • borderType:图像填充的方法。
  • 填充方法:

    BORDER_REPLICATE:复制法,也就是复制最边缘像素。
    BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
    BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
    BORDER_WRAP:外包装法     abcdefgh|abcdefgh|abcdefg
    BORDER_CONSTANT:常量法,常数值填充,需要在设置一个value值,已显示填充的颜色。

    16.视频捕获类(VideoCapture类)

    (可以从视频文件、图像序列和摄像头捕获视频。OpenCV提供了cv2.VideoCapture类来处理视频。VideoCapture类处理视频的方式非常简单、快捷,而且它既能处理视频文件,又能处理摄像头信息。****)

    16.1 读取视频文件–VideoCapture()
    cv2.VideoCapture (const String &filename, int apiPreference=CAP_ANY)  
    

    参数:   (一般仅填入一个,即文件名。如果填入整数,则打开对应的捕获设备ID。若为0,则打开默认摄像头。)

    filename : 打开的视频文件名。

    const String 包括: 视频名 (eg: video.avi)
                                 图像序列 (eg: img_%02d.jpg)
                                URL视频流 (eg: protocol://host:port/script_name?script_params|auth)
    apiPreference : 当多种capture方式都可以使用时,指定一种方式(CAP_FFMPEG or CAP_IMAGES )   
     例子: cv2.VideoCapture capture(“C:/Users/DADA/DATA/gogo.avi”);  // 从视频文件读取

    **16.2 视频参数获取-****-VideoCapture.get()****与设置–**VideoCapture.set()
    cv2.VideoCapture.get()
    

    先读取视频文件:(然后后面可以直接写 video.get() or video.set()

    import cv2
    
    # 读取视频文件
    video = cv2.VideoCapture('./genggui.mp4')
    

    1.获取视频参数:

    # 获取视频参数
    param = video.get(CV_CAP_PROP_FRAME_COUNT) # 也可使用以下数字表示参数
    '''
    cv2.VideoCapture.get(0)		CV_CAP_PROP_POS_MSEC 		视频文件的当前位置,以毫秒为单位
    cv2.VideoCapture.get(1)		CV_CAP_PROP_POS_FRAMES 		基于以0开始的被捕获或解码的帧索引
    cv2.VideoCapture.get(2)		CV_CAP_PROP_POS_AVI_RATIO 	视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
    cv2.VideoCapture.get(3)		CV_CAP_PROP_FRAME_WIDTH 	在视频流的帧的宽度
    cv2.VideoCapture.get(4)		CV_CAP_PROP_FRAME_HEIGHT 	在视频流的帧的高度
    cv2.VideoCapture.get(5)		CV_CAP_PROP_FPS 			帧速率
    cv2.VideoCapture.get(6)		CV_CAP_PROP_FOURCC 			编解码器/fourcc
    cv2.VideoCapture.get(7)		CV_CAP_PROP_FRAME_COUNT		帧数
    cv2.VideoCapture.get(8)		CV_CAP_PROP_FORMAT 			返回对象的格式
    cv2.VideoCapture.get(9)		CV_CAP_PROP_MODE 			返回后端特定的值,该值指示当前捕获模式
    cv2.VideoCapture.get(10)	CV_CAP_PROP_BRIGHTNESS 		图像的亮度(仅适用于照相机)
    cv2.VideoCapture.get(11)	CV_CAP_PROP_CONTRAST 		图像的对比度(仅适用于照相机)
    cv2.VideoCapture.get(12)	CV_CAP_PROP_SATURATION 		图像的饱和度(仅适用于照相机)
    cv2.VideoCapture.get(13)	CV_CAP_PROP_HUE 			色调图像(仅适用于照相机)
    cv2.VideoCapture.get(14)	CV_CAP_PROP_GAIN 			图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
    cv2.VideoCapture.get(15)	CV_CAP_PROP_EXPOSURE 		曝光(仅适用于照相机)
    cv2.VideoCapture.get(16)	CV_CAP_PROP_CONVERT_RGB 	指示是否应将图像转换为RGB布尔标志
    cv2.VideoCapture.get(17)	CV_CAP_PROP_WHITE_BALANCE 	白平衡,暂时不支持
    cv2.VideoCapture.get(18)	CV_CAP_PROP_RECTIFICATION 	立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
    '''
    
    

    2.设置视频参数:

    # 设置视频参数
    video.set(CV_CAP_PROP_FPS, 30) # 第一个参数为设置的参数名,第二个参数为设定的值
    '''
    可设置的参数与上述可获取的参数大体一致
    '''
    
    # 释放
    video.release()
    

    参数与上面大体一致:

    16.3 判断摄像头是否开启 – VideoCapture.isOpened()

    1.先读取视频

    import cv2
    
    # 读取视频文件
    video = cv2.VideoCapture('./test.mp4')	# 参数为视频文件地址,若是数字表示摄像头编号。
    '''
    参数为字符串,表示输入的视频文件的地址及文件名
    参数为数字,表示摄像头编号,默认为-1.即随机选取一个摄像头
    '''
    
    

    2.判断摄像头是否开启

    # 判断视频是否是打开状态
     video.isOpened():
    

    参数:无
    作用:判断设备/文件是否读取成功,若成功,返回True

    16.4 关闭文件/摄像头(释放)–VideoCapture.release()
    cv2.VideoCapture.release()
    

    参数:无
    作用:关闭文件/摄像头

    16.5 读取该文件/摄像头的下一帧 – VideoCapture.read()

    如果正确读取了帧,它将为 True 。因此,你可以通过检 查此返回值来检查视频的结尾。

    cv2.VideoCapture.read()
    

    参数:无
    返回值:bool,numpy.array
    作用:读取该文件/摄像头的下一帧,成功与否由bool返回值决定,返回的帧矩阵为第二个参数

    17.视频读写类(VideoWriter类)

    17.1 cv2.VideoWriter()

    OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。该函数的完整定义如下:

    cv2.VideoWriter(filename,fourcc,fps,frameSize[,isColor])
    
    

    参数:

    filename:需要输出保存的视频文件名。如果文件名存在,覆盖原文件。

    fourcc:视频的编码类型。在OpenCV中,cv2.VideoWriter_fourcc()函数用来指定视频的编码格式。该函数的参数有4个,这4个字符构成了编/解码器的“4字标记”,每个编/解码器都有一个这样的标记。常用标记如下图:

    fps:帧速率,比如录制视频每秒30帧,或者60帧等。

    frameSize:帧的长宽

    isColor:是否为彩色图像

    17.2 write函数–cv2.VideoWriter.write()

    cv2.VideoWriter类中还提供了cv2.VideoWriter.write()函数用于写入下一帧视频。其完整定义如下:

    cv2.VideoWriter.write(image)
    
    

    image参数是需要写入的视频帧

    18.视频读写实战:

    import cv2
    
    # 读取视频文件
    video = cv2.VideoCapture('./test.mp4')	# 参数为视频文件地址,若是数字表示摄像头编号。
    '''
    参数为字符串,表示输入的视频文件的地址及文件名
    参数为数字,表示摄像头编号,默认为-1.即随机选取一个摄像头
    '''
    
    # 创建写视频器
    video_writer = cv2.VideoWriter(filename='./output.mp4', 				# 保存路径文件名
    							   apiPreference=cv2.CAP_FFMPEG,			# 后端
    							   fourcc=cv2.VideoWriter_fourcc(*'mp4v'),	# 视频编解码器
    							   fps=25,									# 视频帧率
    							   frameSize=(1920,1080)					# 视频帧尺寸(W, H)
    							   isColor=True								# 彩色图像或黑白图像
    							   )
    '''
    apiPreference:cv2.CAP_FFMPEG 或者 cv2.CAP_GSTREAMER,此参数是3.x版本的opencv才有的
    fourcc:cv2.VideoWriter_fourcc('M', 'P', '4', 'V') 或 fourcc=cv2.VideoWriter_fourcc(*'mp4v')
    		支持类型:MP4V / X264 / I420 / PIMI / XVID / THEO / FLV1
    '''							   
    
    # 判断视频是否是打开状态
    while video.isOpened():
    	# 读取一帧
    	ret, frame = video.read() # ret是bool类型,表示是否读取成功;frame为获取的帧图像
    
    	if ret:
    		# 写入一帧
    		video_writer.write(frame)
    		# 播放视频
    		cv2.imshow('frame', frame)
    		cv2.waitKey(1) # 通过设置等待时间改变播放速度
    	else:
    		break
    
    # 释放
    video.release()
    video_writer.release()	# 不释放会无法完成写视频,类似文件写完后的close()
    
    

    19.图像直方图

    19.1 直方图 – hist = cv2.calcHist(  )
    hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
    
  • hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数。

  • images:原始图像,该图像需要使用“[ ]”括起来.

  • channels:指定通道编号。通道编号需要用“[ ]”括起来,如果输入图像是单通道灰度图像,该参数的值就是[0]。对于彩色图像,它的值可以是[0]、[1]、[2],分别对应通道B、G、R。

  • mask:掩模图像。当统计整幅图像的直方图时,将这个值设为 None。当使用掩模图像获取直方图时,仅获取掩模参数 mask 指定区域的直方图。

  • histSize:BINS 的值,该值需要用“[ ]”括起来。例如,BINS 的值是 256,需要使用“[256]”作为此参数值。

  • ranges:即像素值范围。例如,8 位灰度图像的像素值范围是[0, 255]。

  • accumulate:累计(累积、叠加)标识,默认值为 False。如果被设置为 True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。该参数允许从多个对象中计算单个直方图,或者实时更新直方图。该参数是可选的,一般情况下不需要设置。

  • 19.2 直方图均衡化

    (统计出来的像素点的值之间的差距比较大,我们需要缩小像各个像素点之间的值得差距,这就叫均衡化。)

    dst = cv2.equalizeHist( src )
    

    参数:src 是 8 位单通道原始图像,dst 是直方图均衡化处理的结果。

    20.模板匹配

    result=cv2.matchTemplate( img,template,method)
    

    参数:

  • image:原始图像S
  • **template 😗*模板图像T,一般是源图像S中的一小块
  • method: 实现模板匹配的算法,主要有:
  • 1.平方差匹配(CV_TM_SQDIFF):利用模板与图像之间的平方差进行匹配,最好的匹配是0,匹配越差,匹配的值越大。
    2.相关匹配(CV_TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
    3.利用相关系数匹配(CV_TM_CCOEFF):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。

    21.霍夫变换

    21.1 霍夫线检测

    霍夫变换常用来提取图像中的直线和圆等几何图形,霍夫空间中的一条线对应笛卡尔坐标系中一个点,笛卡尔坐标系中两个点,对应霍夫空间一条直线。

    cv2.HoughLines(img,rho,theta,threshold)
    

    参数:

  • img:检测的图像,要求是二值化的图像,所以在调用霍夫变换之前首先要迸行二值化,或者迸行Canny边缘检测
  • rho、theta: 两个角度的精确度
  • threshold:阈值,只有累加器中的值高于该阈值时才被认为是直线
  • 作者:普通网友

    物联沃分享整理
    物联沃-IOTWORD物联网 » OpenCV函数大全(超级详细版)-python操作_opencv python 函数

    发表回复