基础篇

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()#销毁全部窗口
Read Video

 

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)                # 创建一张空白图像用
Draw Picture
 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()
Draw circle

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')
Pixel Operation

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()                  # 显示整个界面
Mask Border
 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()
ROI

 

 

 

 

 

 

 

                                                                                 

           

posted @ 2020-03-08 13:53  搬瓦匠  阅读(160)  评论(0编辑  收藏  举报