cv(二)
1.cv读视频的时候会分析内容,然后对每一帧进行处理,cv并不是音视频的编码解码的工具,cv是要对读过来的内容进行对象检测,对象跟踪,音视频的编码解码是由ffmg来做的,所以cv读出来的视频是没有声音的,对视频大小是有一定限制的。
2.

1 import cv2 as cv 2 import numpy as np 3 4 5 def access_pixels(image): 6 print(image.shape) 7 height = image.shape[0] # 高 8 width = image.shape[1] # 宽 9 channels = image.shape[2] # 通道数 10 print('widti: %s, height: %s, channels: %s' %(height, width, channels)) 11 # 获取像素值 12 for row in range(height): 13 for col in range(width): 14 for c in range(channels): 15 pv = image[row, col, c] 16 image[row, col, c] = 255 - pv # 图像反转 17 cv.imshow('pixels_demo', image) 18 19 20 def create_image(): 21 img = np.zeros((400, 400, 3), np.uint8) # 创建一张三通道图 22 img[:, :, 0] = np.ones((400, 400))*255 # 修改第一通道 23 24 img2 = np.zeros((400, 400, 1), np.uint8) # 创建单通道图像 25 img2[:, :, 0] = np.ones((400, 400))*127 26 27 m1 = np.ones((3, 3), np.uint8) 28 m1.fill(12222.388) 29 print(m1) 30 m2 = m1.reshape((1, 9)) # 改变图像形状 31 print(m2) 32 33 cv.imshow('new image', img) 34 35 36 def inverse(image): 37 dst = cv.bitwise_not(image) # 像素取反,因为底层是c实现的,所以要比自己实现的access_pixels(src)要快很多 38 cv.imshow('inverse image', dst) 39 40 n3 = np.array([[2, 3, 4], [4, 5, 6], [7, 8, 9]], np.int32) 41 n3.fill(9) 42 print(n3) 43 44 print('--------Hello Python------------') 45 src = cv.imread('') # 读图 46 t1 = cv.getTickCount() # 获取当前cpu转的时钟圈数 47 access_pixels(src) 48 t2 = cv.getTickCount() # 获取当前cpu转的时钟圈数 49 # 计算性能 50 time = (t2-t1)/cv.getTickFrequency() 51 print('time: %s ms'%(time * 1000)) # t2-t1:总圈数 (t2-t1)/cv.getTickFrequency():每秒的圈数
3.色彩空间

1 import cv2 as cv 2 import numpy as np 3 4 ''' 5 常见的色彩空间:RGB HSV HIS YCrCb(常用于皮肤特征提取) YUV 6 HSV: H(0-100) S(0-255) V(0-255) 7 ''' 8 # 色彩空间转换,从bgr到gray,hsv,yuv,ycrcb 9 def color_space_demo(image): 10 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) 11 cv.imshow("gray", gray) 12 13 hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV) 14 cv.imshow("hsv", hsv) 15 16 yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV) 17 cv.imshow("yuv", yuv) 18 19 ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb) 20 cv.imshow("ycrcb", ycrcb) 21 22 23 # 从视频中提取指定颜色范围,并将其置为白,其余置为黑 24 def extract_object_demo(): 25 capture = cv.VideoCapture("cv.gif") 26 while True: 27 ret, frame = capture.read() 28 29 if ret is False: # 如果没有获取到视频帧则返回false 30 break 31 hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) # 首先转换成hsv空间 32 # lower_hsv和upper_hsv是根据表查出来的,不是随便填的 33 lower_hsv = np.array([35, 43, 46]) # hsv中h,s,v的最小值 34 upper_hsv = np.array([77, 255, 255]) # hsv中的h,s,v最大值 35 36 # 提取指定颜色区域,保留指定颜色区域, 其余置为黑(0) 37 mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv) # 用inRange函数提取指定颜色范围,这里对hsv来处理 38 cv.imshow("video", frame) 39 cv.imshow("mask", mask) 40 41 c = cv.waitKey(40) 42 if c == 27: # 27是esc键 43 break 44 45 46 # 对图片三个通道颜色提取并放在三张图片中 47 def channels_split_merge(image): 48 # 通道分离 49 b, g, r = cv.split(image) # b或g或r通道取时,对该通道颜色保留,其余通道置为0 50 cv.imshow("blue", b) 51 cv.imshow("green", g) 52 cv.imshow("red", r) 53 54 changed_image = image.copy() 55 56 changed_image[:, :, 2] = 0 # 将r通道颜色全部置为0 57 cv.imshow("changed_image", changed_image) 58 59 # 通道合并 60 merge_image = cv.merge([b, g, r]) 61 cv.imshow("merge_image", merge_image) 62 63 if __name__ == '__main__': 64 65 src = cv.imread("../images/CrystalLiu1.jpg") # 读入图片放进src中 66 cv.namedWindow("Crystal Liu", cv.WINDOW_AUTOSIZE) # 创建窗口, 窗口尺寸自动调整 67 cv.imshow("Crystal Liu", src) # 将src图片放入该创建的窗口中 68 # color_space_demo(src) 69 # extract_object_demo() 70 channels_split_merge(src) 71 cv.waitKey(0) 72 cv.destroyAllWindows()
4.像素运算

1 import cv2 as cv 2 import numpy as np 3 4 '''像素运算: 运算前需要保证两个图像大小必须一样 5 算术运算:加减乘除,调节亮度,调节对比度 6 逻辑运算:与或非''' 7 8 def add_demo(m1, m2): 9 # 加 10 dst = cv.add(m1, m2) 11 cv.imshow("add_demo", dst) 12 13 14 def subtract_demo(m1, m2): 15 # 减 16 dst = cv.subtract(m1, m2) 17 cv.imshow("subtract_demo", dst) 18 19 20 def divide_demo(m1, m2): 21 # 除 22 dst = cv.divide(m1, m2) 23 cv.imshow("divide_demo", dst) 24 25 26 def multiply_demo(m1, m2): 27 # 乘 28 dst = cv.multiply(m1, m2) 29 cv.imshow("multiply_demo", dst) 30 31 # 图像的逻辑运算,:AND,OR,NOT,XOR 32 def logic_demo(m1, m2): 33 dst1 = cv.bitwise_and(m1, m2) # 与 dst = cv.bitwise_and(frame, frame, mask=mask) 34 dst2 = cv.bitwise_not(m1) # 非 35 dst3 = cv.bitwise_or(m1, m2) # 或 36 cv.imshow("logic_demo", dst1) 37 38 # 调节亮度和对比度 39 def contrast_brightness_demo(image, c, b): 40 h, w, ch = image.shape 41 blank = np.zeros([h, w, ch], image.dtype) # 创建一个空白图像 42 43 # 图像混合,c:对比度, 1-c为这两张图片的权重 b:亮度 44 dst = cv.addWeighted(image, c, blank, 1-c, b) 45 cv.imshow("contrast_brightness_demo", dst) 46 47 48 # 对照片像素做均值方差 49 def others(m1, m2): 50 M1 = cv.mean(m1) # 计算均值 51 M2 = cv.mean(m2) 52 print(M1) 53 print(M2) 54 55 mean1, dev1 = cv.meanStdDev(m1) # 返回均值和方差,通过方差可以判断除像素之间的差异性 56 print("均值:",mean1,"方差:", dev1) 57 58 59 if __name__ == '__main__': 60 print("----------Hello World!----------") 61 src1 = cv.imread("../images/01.jpg") 62 src2 = cv.imread("../images/02.jpg") 63 print(src1.shape) 64 print(src2.shape) 65 66 cv.namedWindow("image1", cv.WINDOW_AUTOSIZE) # 创建窗口, 窗口尺寸自动调整 67 cv.imshow("image1", src1) 68 cv.imshow("image2", src2) 69 70 # add_demo(src1, src2) 71 # subtract_demo(src1, src2) 72 # divide_demo(src1, src2) 73 # multiply_demo(src1,src2) 74 # others(src1, src2) 75 76 # logic_demo(src1, src2) 77 src = cv.imread("../images/CrystalLiu2.jpg") 78 contrast_brightness_demo(src,1.3, 80) 79 cv.waitKey(0) 80 81 cv.destroyAllWindows()