Python3+Opencv3常用函数(慢慢更新中)


本博文主要记录在python3编程环境下常用的一些opencv3函数,可根据右侧的目录选择自己需要使用的函数说明。



图像的读取、分割以及保存

import cv2
import numpy as np

img = cv2.imread('test.jpg')  # 读入一张图片,注意Opencv彩色图像排序是BGR
im_height, im_width, im_dep = img.shape  # 获取图像的高,宽以及深度。若图像是灰度或二值只返回高和宽
img_size = img.size   # 返回图像的像素数目,高x宽x深度
ROI = img[10:100, 20:50, :]  # 提取ROI,10:100表示提取原图的第10行到第100行
                             # 20:50表示提取原图的第20列到第50列
                             # 第三个参数:表示提取所有通道,若只提取G通道则为1
cv2.imwrite('ROI_image.jpg',ROI)  # 保存图片

图像像素的遍历

图像像素的遍历方法并不唯一,可以提供两种方法:

1)使用普通切片的方式:

import cv2

img = cv2.imread("1.jpg")
height, width, channel = img.shape

for i in range(height):
    for j in range(width):
        val_R = img[i, j, 2]
        val_B = img[i, j, 1]
        val_G = img[i, j, 0]

2)使用numpy的迭代器:

import cv2

img = cv2.imread("1.jpg")
height, width, channel = img.shape

for i in range(height):
    for j in range(width):
        val_R = img.item(i, j, 2)
        val_B = img.item(i, j, 1)
        val_G = img.item(i, j, 0)

摄像头、视频的读取以及保存

摄像头的打开与读取

import cv2
import numpy as np

cap = cv2.VideoCapture(0)  # 打开内置摄像头,设置成1或者其他值来调用其他摄像头

if cap.isOpened() is False:   # 确认摄像头是否成功打开
    print('Error')
    exit(1)

while True:
    ret, frame = cap.read()
    cv2.imshow('frame', frame)  # 显示图像帧
    if cv2.waitKey(20) & 0xFF == ord('q'):  # 每隔20ms采集一帧,按q键退出采集
        break

cap.release()

视频文件的读取与保存

import cv2
import numpy as np

cap = cv2.VideoCapture('video.mp4')  # 打开视频文件

if cap.isOpened() is False:   # 确认视频是否成果打开
    print('Error')
    exit(1)

frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))   # 获取图片帧宽度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取图像帧高度
fps = float(cap.get(cv2.CAP_PROP_FPS))                 # 获取FPS
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))   # 获取总帧数

# 创建保存视频,指定保存视频名称,指定视频编码器,视频帧率,图像帧尺寸
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height))

ret, frame = cap.read() # 读取一帧图像,当视频帧读取完毕ret标识符为False
while ret:
    cv2.imshow('frame', frame)  # 显示图像帧
    cv2.waitKey(20)   # 帧间隔为20ms
    frame = cv2.flip(frame, 0)  # 对图像进行水平翻转
    out.write(frame)  # 将frame写入视频
    ret, frame = cap.read()  # 读取下一帧

cap.release()
out.release()

图像常用变换

色彩空间的变换

img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # BGR转灰度图像,注意opencv读入的是BGR格式
                                               # 常用的还有BGR转RGB(cv2.COLOR_BGR2RGB)等等

图像的二值化

threshold = 155
_, binary_image = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)  # 将灰度转为二值图像
# cv2.shreshold函数第一个参数是输入图像,第二个参数是阈值,第三个参数是将超过阈值的像素值修改成设定值,
# 第四个参数是具体实施方法,若改为cv2.THRESH_BINARY_INV就是将小于阈值的像素值修改成设定值,其他值为零,即反转

图像的旋转

M = cv2.getRotationMatrix2D((width/2, height/2), angle, scale)
# M为旋转矩阵,第一个参数是设定旋转中心,第二个参数是旋转角度(单位是度,逆时针为正),第三个参数是缩放比例
ratation = cv2.warpAffine(image, M, (width, height))

如果只是想简单将图片旋转90度,180度或者270度可以使用rotate方法:

# 顺时针旋转90度
img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

# 旋转180度
img = cv2.rotate(img, cv2.ROTATE_180)

# 顺时针旋转270度,即逆时针旋转90度
img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)

图像的缩放

re_resize = cv2.resize(im, (width, height), interpolation=cv.INTER_NEAREST)
# im为读入的图片, (width, height)为缩放后的尺寸, cv.INTER_NEAREST为采用最近邻插值

图像形态学处理

图像的膨胀与腐蚀

import cv2

img = cv2.imread('1.bmp', 0)

# OpenCV定义的结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 腐蚀图像
eroded = cv2.erode(img, kernel)
cv2.imshow("Eroded Image", dilated)

# 膨胀图像
dilated = cv2.dilate(img, kernel)
cv2.imshow("Dilated Image", dilated)
cv2.waitKey(0)

cv.destroyAllWindows()

图像的开运算与闭运算

import cv2

img = cv2.imread('1.bmp', 0)
# 定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 闭运算
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 显示腐蚀后的图像
cv2.imshow("Close", closed);

# 开运算
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 显示腐蚀后的图像
cv2.imshow("Open", opened);
cv2.waitKey(0)

cv2.destroyAllWindows()

图像轮廓相关函数

获取轮廓函数findCountours

import numpy as np
import cv2

im = cv2.imread('test.jpg')   # 读入图片
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)   # 图像灰度化
ret, thresh = cv2.threshold(imgray, 200, 255, cv2.THRESH_BINARY)   # 图像二值化
image, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 获取轮廓

返回的image是绘制了边框后的图像,findContours的第二个函数主要有:cv2.RETR_LIST, cv2.RETR_CCOMP, cv2.RETR_EXTERNAL可控选择

绘制轮廓函数drawContours

cv2.drawContours(image, contours, -1, (255, 0, 0), 3)    # 将所有轮廓全都绘制到image上,
                                                         # 若image是灰度或者二值图像将(255,0,0)改为任意灰度值,如200
cv2.drawContours(image, [contours[i]], -1, (255, 0, 0), 3)   # 只绘制其中某一个轮廓

计算轮廓包围区域面积、行心

area = cv2.contourArea([contours[i]])   # 计算区域面积
M = cv2.moments(contours[i])            # 区域的矩
cx = M['m10'] / M['m00']    # 行心x坐标(M['m00']也是区域的面积)
cy = M['m01'] / M['m00']    # 行心y坐标

绘制轮廓外接矩形框

绘制轮廓的外界矩形框有两个算法,一个是不带旋转的,一个是带旋转的(最小面积外接矩形框)。如下图所示,黑色代表目标,红色的矩形框是不带旋转的,橙色的带旋转的。

  • 不带旋转的外接矩形框
x, y, w, h = cv2.boundingRect(contour)  # contour为一轮廓点集
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
  • 带旋转的外接矩形框
rect = cv2.minAreaRect(contour)  # 得到的是最小外界矩形框的中心点坐标(x,y),(宽度,高度),旋转角度
box = cv2.boxPoints(rect)     # 将rect转换成最小外接矩形的四个顶点[x0, y0], [x1, y1], [x2, y2], [x3, y3]
box = np.int0(box)            # float转int,注意int0这个函数虽然没有参考文档但可以直接使用
cv2.drawContours(img, [box], -1, (255, 0, 0), 2)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值