1. 基本 I/O 脚本
1.1 图片读取
- import time
- num = 2-1-3+3
- print(num)
- # 打开显示图像
- if num == 1:
- # 读取图像, 支持 bmp,jpg,PNG,tiff 等常用格式
- img = cv2.imread(r"D:\UIAUTO\trainingSet\simpleGeometricFigure\1.jpg")
- # 创建窗口并显示图像
- cv2.namedWindow("Image")
- cv2.imshow("Image", img)
- # 刷新窗口
- cv2.waitKey(0)
- # 释放窗口
- cv2.destroyAllWindows()
cv2 读取图片
1.2 图像与原始字节之间转换
- # 2.1.2 图像与原始字节之间的转换
- # 随机生成两个图像, 他们位于脚本所在的目录, 图像名为 RandomGray.PNG 和 RandomColor.PNG.
- if num == 2-1-2:
- randomByteArray = bytearray(os.urandom(120000))
- flatNumpyArray = numpy.array(randomByteArray)
- grayImage = flatNumpyArray.reshape(300, 400)
- cv2.imwrite('RandomGray.png', grayImage)
- bgrImage = flatNumpyArray.reshape(100, 400, 3)
- cv2.imwrite('RandomColor.png', bgrImage)
图像与原始字节之间的转换
1.3 使用 numpy.array 访问图像数据
- # 2.1.3 使用 numpy.array 访问图像数据
- if num == 2-1-3+1:
- img = cv2.imread(r"D:\UIAUTO\trainingSet\simpleGeometricFigure\1.jpg")
- # 将 jpg 图像在左上宽 50 高 50 区域像素, 处转化为红色像素
- for a in range(0, 50):
- for b in range(0, 50):
- img[a, b] = [2, 3, 255]
- cv2.imwrite("1.jpg", img)
- # item(x,y, 通道索引 0-2)
- print("x:49 y:49 R:", img.item(49, 49, 0))
- print("x:49 y:49 G:", img.item(49, 49, 1))
- print("x:49 y:49 B:", img.item(49, 49, 2))
- # 把区域像素设置为白色, 不改变读入的图片像素
- for x in range(0, 50):
- for y in range(0, 50):
- img.itemset((x, y, 0), 250)
- img.itemset((x, y, 1), 250)
- img.itemset((x, y, 2), 250)
- cv2.imwrite("21.jpg", img)
访问图像数据
1.4 像素变换
- # 像素变换
- # 这种变化速度优于上面的循环变换
- if num == 2-1-3+2:
- img = cv2.imread(r"D:\PythonWorkspace\deep leanr\venv\21.jpg")
- img[0:200:1, 0:200:1, 1] = 2
- cv2.imwrite('22.jpg', img)
- time.sleep(2)
像素变换
1.5 图像区域拷贝
- # 图像区域拷贝
- if num == 2-1-3+3:
- img = cv2.imread(r'D:\PythonWorkspace\deep leanr\venv\18151.jpg')
- my_roi = img[0:100:1, 0:100:1]
- img[300:400:1, 300:400:1] = my_roi
- cv2.namedWindow("Image")
- cv2.imshow("Image", img)
- cv2.waitKey(0) # 刷新时间
- cv2.destroyAllWindows() # 释放窗口
- print(img.shape) # 返回一个数组: [宽度, 高度, 通道数]
- print(img.size) # 像素大小
- print(img.dtype) # 图像的数据类型
图像区域拷贝
2. 视频 I/O 与捕获摄像头帧
2.1 视频读取
- import cv2
- # I/O 视频文件
- if num == 1:
- videoCapture = cv2.VideoCapture('MyInputVid.avi')
- fps = videoCapture.get(cv2.CAP_PROP_FPS)
- size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
- int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))
- )
- videoWriter = cv2.VideoWriter('MyOutputVid.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
- success, frame = videoCapture.read()
- while success: # Loop until there are no more frames.
- videoWriter.write(frame)
- success, frame = videoCapture.read()
视频文件读取
2.2 捕获摄像头的帧, 写入磁盘
- if num == 2:
- cameraCapture = cv2.VideoCapture(0)
- fps = 30 # an assumption
- size = (
- int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
- int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))
- )
- videoWriter = cv2.VideoWriter('MyOutputVid.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
- success, frame = cameraCapture.read()
- numFrameRemaining = 10 * fps - 1
- while success and numFrameRemaining> 0:
- videoWriter.write(frame)
- success, frame = cameraCapture.read()
- numFrameRemaining -= 1
- cameraCapture.release()
捕获摄像头的帧
2.3 在窗口显示摄像头帧, 按键盘大部分键位关闭窗口
- # 在窗口显示摄像头帧
- # waitKey() 的参数为等待键盘触发的时间, 单位为毫秒, 其返回值是 - 1(表示没有键被按下) 或 ASCLL 码.
- # 另外, python 提供了一个标准函数 ord(), 该函数可以将字符转换为 ASCLL 码. 例如, 输入 ord('a') 会返回 97
- # OpenCV 的窗口函数和 waitKey() 函数互相依赖. OpenCV 的窗口只有在调用 waitKey() 函数时才会更新, waitKey() 函数只有在 OpenCV
- # 窗口成为活动窗口时, 才能捕获输入信息.
- # 鼠标回调函数 setMouseCallback() 有五个参数, 如前面的实列代码所示. param 为可选参数,
- # 它是 setMouseCallback() 函数的第三个参数, 默认情况下, 该参数是 0. 回调事件参数可以取如下的值, 他们分别对应不同的鼠标事件.
- # cv2.EVENT_MOUSEMOVE: 该事件对应鼠标移动
- # cv2.EVENT_LBUTTONDOWN: 鼠标左键按下
- # cv2.EVENT_RBUTTONDOWN: 鼠标右键按下
- # cv2.EVENT_MBUTTONDOWN: 鼠标中间键按下
- # _LBUTTONUP: 鼠标左键松开
- # _RBUTTONUP:
- # _MUBTTONUP:
- # _LBUTTONDBLCLK: 双击鼠标左键
- # _RBUTTONDBLCLK:
- # _MBUTTONDBLCLK:
- # 鼠标回调的标志参数可能是一下事件的按位组合
- # cv2.EVENT_FLAG_LUBTTON: 该事件对应按下鼠标左键
- # cv2.EVENT_FLAG_RBUTTON: 该事件对应按下鼠标右键
- # cv2.EVENT_FLAG_MBUTTON: 该事件对应按下鼠标中间键
- # _FLAG_CTRLKEY: 按下 Ctrl 键
- # _FLAG_SHIFTKEY: 按下 Shift 键
- # _FLAG_ALTKEY: 按下 Alt 键
- # 然而, OpenCV 不提供任何处理窗口事件的方法. 例如, 当单击窗口的关闭按钮时, 并不能关闭应用程序.
- # 由于 OpenCV 有限的事件处理能力和 GUI 处理能力, 许多开发人员更喜欢将 OpenCV 集成到其他应用程序框架中.
- if num == 3:
- clicked = False
- def onMouse(event, x, y, flags, param):
- global clicked
- if event == cv2.EVENT_LUBTTONUP:
- clicked = True
- cameraCapture = cv2.VideoCapture(0)
- cv2.namedWindow('MyWindow')
- cv2.setMouseCallback('MyWindow', onMouse)
- print('Showing camera feed. Click window or press any key to stop')
- success, frame = cameraCapture.read()
- while success and cv2.waitKey(1) == -1 and not clicked:
- cv2.imshow('MyWindow', frame)
- success, frame = cameraCapture.read()
- cv2.destroyWindow('MyWindow')
- cameraCapture.release()
按键关闭窗口
GitHub 代码示例地址:
来源: http://www.bubuko.com/infodetail-2998593.html