基础篇
1、读取图像并保存
1 # 导入必要的库 2 import cv2 as cv 3 path = r'C:\Users\Jon\Pictures\Saved Pictures\pig.jpg' # 图片地址 4 cv.namedWindow('pig', cv.WINDOW_AUTOSIZE) # 创建窗口用于显示图片,参数1:窗口名,参数2:窗口大自动调节 5 img = cv.imread(path, 1) # 将图片读取至内存,参数1:图片地址,参数2:图片色彩,1为彩色,0为灰度图,默认为1 6 cv.imshow('pig', img) # 展示图片,参数1:窗口名,参数2:需要显示的图片 7 cv.waitKey(5000) # 参数5000,表示图片显示5秒后自动关闭窗口 8 cv.imwrite(r'C:\Users\Jon\Pictures\Saved Pictures\pig_copy.jpg', img) # 保存图片,参数1:图片名称,参数2:需要保存的图片 9 cv.destroyAllWindows() # 关闭所有窗口
2、读取视频并保存
1importcv2ascv2cap=cv.VideoCapture(0)#创建一个cv.VideoCapture()对象,0为设备号,若要打开视频文件,添加文件路径。3cap.set(cv.CAP_PROP_FRAME_WIDTH,800)#自定义窗口宽度、高度,默认320*2404cap.set(cv.CAP_PROP_FRAME_HEIGHT,680)5ifnotcap.isOpened():#检查摄像头设备是否打开,没有打开使用cv.open打开6print('itisopeningcamera...')7cap.open(0)#0为设备索引号,若打开视频则为视频地址8whileTrue:9ret,frame=cap.read()#读取视频帧,配合VideoCapture使用10frame=cv.flip(frame,1)#除去摄像镜像画面11ifnotret:#检查是否读取到视频帧12print("Don'treceiveframe...")13exit()14cv.imshow('Video',frame)15ifcv.waitKey(1)==ord('q'):#键入命令q退出16break17cap.release()#释放设备18cv.destroyAllWindows()#销毁全部窗口
Save Video
3、画笔操作
1 # 导入必要的库 2 import cv2 as cv 3 import numpy as np 4 # 直线 #于放置元素 5 cv.line(img=img, pt1=(0, 0), pt2=(100, 100), color=(255, 255), thickness=2) # 绘制直线图像 6 # cv.line:参数1:目标图像,参数2:起始点,参数3:终点,参数4:线色,参数5:线宽 7 # 矩形 # 8 cv.rectangle(img=img, pt1=(100, 100), pt2=(200, 200), color=150, thickness=2) 9 # cv.rectangle:参数1:目标图像,参数2:左上角,参数3:右下角,参数4:线色,参数5:线宽 10 # 圆 # 11 cv.circle(img=img, center=(150, 150), radius=50, color=(219, 255), thickness=-1) # 闭环使用-1,(填充整个图案) 12 # cv.circle:参数1:目标图像,参数2:圆心,参数3:半径,参数4:线色,参数5:线宽 13 # 直线 # 14 cv.line(img=img, pt1=(200, 200), pt2=(300, 300), color=(255, 255), thickness=2, lineType=cv.LINE_4) 15 # 椭圆 # 16 cv.ellipse(img=img, center=(300, 300), axes=(80, 30), angle=45, startAngle=0, 17 endAngle=360, color=210, thickness=-1, lineType=cv.LINE_4) # lineType只是生产线段的算法 18 # cv.ellipse:参数1:目标图像,参数2:圆心,参数3:长轴和短轴,参数4:水平旋转角度,参数5-6:绘制图像大小(0-360为整圆) 19 # 参数7:线色,参数8:线宽,参数9:线形, 20 # 多边形 # 21 pts = np.array([[350, 350], [350, 460], [460, 380], [460, 410]], dtype=np.int32) 22 cv.polylines(img=img, pts=[pts], isClosed=False, color=230, 23 thickness=4, lineType=cv.LINE_4) # isClosed=false 将获得折线段 24 # cv.polyline:参数1:目标图像,参数2:各个顶点,参数3:是否封闭,参数4:线色,参数5:线宽,参数6:线宽 25 # 文字 # 26 font = cv.FONT_ITALIC # CV.FONT_X为字体类型 27 cv.putText(img=img, text="OpenCv,Hello!---Jon", org=(20, 400), fontFace=font, 28 fontScale=1, color=(0, 0, 240), thickness=1, lineType=cv.LINE_AA) # cv.LINE_AA更好 29 # cv.putText:参数1:目标图像,参数2:文字,参数3:文本位置,左上角的点,字体样式,参数4:字体比例,参数5:字体颜色 30 # 参数6:字体宽度,参数7:线型 31 cv.imshow('Image', img) 32 cv.waitKey(0) 33 img = np.zeros((500, 500, 3), np.uint8) # 创建一张空白图像用
1 import cv2 as cv 2 import numpy as np 3 # 定义一个函数用于画圆 4 def draw_circle(event, x, y, flags, param): 5 if event == cv.EVENT_LBUTTONDOWN: 6 # cv.EBENT_LBUTTONDOWN表示产生鼠标左键被按压。 7 cv.circle(img=img, center=(x, y), radius=10, color=255, thickness=-1) 8 img = np.zeros((512, 512, 3), np.uint8) # 创建512*512三通道空白图像 9 cv.namedWindow('Image') 10 cv.setMouseCallback('Image', draw_circle) # 鼠标回调函数,此函数包含鼠标的各项操作 11 # 此函数会记录鼠标的坐标位置,x,y,参数1:目标图像,参数2:鼠标发生事件 12 while True: 13 cv.imshow('Image', img) 14 if cv.waitKey(20) == ord('q'): 15 break 16 cv.destroyAllWindows()
4、画笔操作
1 import cv2 as cv 2 img = cv.imread(r'C:\Users\Jon\Pictures\Saved Pictures\pig.jpg', 1) 3 print('第100行BGR值:', img[100]) 4 img[100] = [210, 56, 23] 5 print('第100行修改后的BGR值:', img[100]) 6 # 访问某一像素值 7 print('图像[100, 100]点像素值:', img[100, 100]) 8 # 访问某一像素BGR值 9 print('图像[100, 100]点像素B通道值:', img[100, 100, 0]) 10 # 更优访问BGR值 11 print('图像[10, 10]点像素R通道值:', img.item(10, 10, 2)) # (像素值,通道值) 12 # 更修更改某一像素BGR值 13 img.itemset((10, 10, 2), 50) # ((像素值,通道值),设定值) 14 print('图像[10, 10]点像素R通道值:', img.item(10, 10, 2)) 15 # 访问图像属性 16 print('图像维度及通道:', img.shape) 17 print('图像总像素值:', img.size) 18 print('图像数据类型:', img.dtype) 19 # 拆分和合并图像通道, cv.split()是一项耗时的操作,numpy索引更快 20 B, G, R = cv.split(img) # 图像分离BGR通道 或者 b = img[:,:, 0].... 21 print('\nB=', B, '\nG=', G, '\nR=', R) 22 img = cv.merge([R, G, B]) # 图像合成BGR 23 cv.imshow('Image', img) 24 if cv.waitKey(0) == ord('q'): 25 cv.destroyWindow('Image')
5、画笔操作
1 import cv2 as cv 2 import matplotlib.pyplot as plt 3 img = cv.imread(r'C:\Users\Jon\Pictures\Saved Pictures\pig.jpg', 1) 4 color = (240, 96, 89) # 图像边框颜色 5 # src:图像源, top据顶部的距离,bottom据底部的距离,left据左边距离,right据右边框的距离,borderType 边界类型 6 reflect = cv.copyMakeBorder(src=img, top=10, bottom=10, left=10, right=10, borderType=cv.BORDER_REFLECT) 7 replicate = cv.copyMakeBorder(src=img, top=10, bottom=10, left=10, right=10, borderType=cv.BORDER_REPLICATE) 8 constant = cv.copyMakeBorder(src=img, top=20, bottom=20, left=20, right=20, borderType=cv.BORDER_CONSTANT, value=color) 9 reflect_101 = cv.copyMakeBorder(src=img, top=20, bottom=20, left=20, right=20, borderType=cv.BORDER_REFLECT_101) 10 plt.subplot(231), plt.imshow(img), plt.title('Original') # plt.subplot(xyz) 创建x*y个块,z当前图像显示块 11 plt.subplot(232), plt.imshow(reflect), plt.title('Reflect') # plt.imshow()显示图像 12 plt.subplot(234), plt.imshow(replicate), plt.title('Replicate') # plt.title 添加标题 13 plt.subplot(235), plt.imshow(constant), plt.title('Constant') 14 plt.subplot(236), plt.imshow(reflect_101), plt.title('Reflect_101') 15 plt.show() # 显示整个界面
1 import cv2 as cv 2 img1 = cv.imread('litter_big_1.jpg') # 加载两张图片 3 img2 = cv.imread('opencv.png') 4 rows,cols,channels = img2.shape # 我想把logo放在左上角,所以我创建了ROI 5 roi = img1[0:rows, 0:cols ] 6 img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY) # 现在创建logo的掩码,并同时创建其相反掩码 7 ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY) 8 mask_inv = cv.bitwise_not(mask) 9 # 现在将ROI中logo的区域涂黑 10 img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv) 11 # 仅从logo图像中提取logo区域 12 img2_fg = cv.bitwise_and(img2,img2,mask = mask) 13 # 将logo放入ROI并修改主图像 14 dst = cv.add(img1_bg,img2_fg) 15 # img1[0:rows, 0:cols ] = dst 16 # cv.imshow('res',img1) 17 cv.imshow('img1_bg', img1_bg) 18 cv.imshow('img1_fg', img2_fg) 19 cv.imshow('mask_inv', mask_inv) 20 cv.waitKey(0) 21 cv.destroyAllWindows()