简介
看到个有趣的东西在用这个,之前也经常用这个来操作图片,但都是网上的代码,没好好看过文档,这次就好好看一下文档,记录一下自己觉得有意思的吧。(太深了也看不懂,简单过一下有个印象,图像处理类都可以问问GPT能不能用opencv实现
OpenCV-Python是基于Python的库,旨在解决计算机视觉问题。
安装
pip3 install opencv-python
验证安装:
>>> import cv2
>>> print(cv2.__version__)
4.8.0
说明
基础
import cv2
# 打开图片,最后表示彩色
img = cv2.imread('1.png', cv2.IMREAD_COLOR)
img变量其实是一个 numpy.ndarray
的 B,G,R 三个值的列表
显示图片和截图
import cv2
# 打开图片,最后表示彩色
img = cv2.imread('1.png', cv2.IMREAD_COLOR)
# 展示图片
cv2.imshow('lena', img)
# 等待3秒后关闭,设置为0会无限等待
cv2.waitKey(3000)
# 图像形状,彩色返回高、宽和通道数
print(img.shape)
# ROI截图
aa = img[0:524, 115:188] # 前面是行(y),后面是列(x)
cv2.imshow('aa', aa)
cv2.waitKey(3000)
# 写入图片
cv2.imwrite("2.png", aa)
因为截图需要定位到坐标,一个一个试有点恼火,提供一个办法,点击图片返回坐标:
import cv2
# 鼠标点击事件的回调函数
def mouse_callback(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print("坐标 (x, y):", x, y)
# 加载图像
image = cv2.imread('1.png')
# 在图像上显示窗口
cv2.namedWindow('image')
cv2.setMouseCallback('image', mouse_callback)
while True:
cv2.imshow('image', image)
key = cv2.waitKey(1) & 0xFF
# 按 'q' 键退出循环
if key == ord('q'):
break
cv2.destroyAllWindows()
视频
所有操作都可以和图片一样,只是记录一下如何使用视频(摄像头或者加载视频都可以
# 打开摄像头并灰度化显示
import cv2
# 初始化
capture = cv2.VideoCapture(0) # 不知道为啥会连接到我的Iphone上
while capture.isOpened():
# 设置
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
capture.set(cv2.CAP_PROP_FPS, 30)
# 获取一帧
ret, frame = capture.read()
# 将这帧转换为灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
capture.release()
cv2.destroyAllWindows()
颜色追踪
一般用HSV来追踪,所以我们需要先把图片转换为HSV的,然后再根据HSV颜色范围来
import cv2
import numpy as np
# 打开图片,最后表示彩色
img = cv2.imread('1.png', cv2.IMREAD_COLOR)
# 转换图片,一般用HSV来区分颜色
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 只显示红色的内容
lower_red = np.array([0, 70, 50]) # HSV中红色范围,可以用GPT辅助
upper_red = np.array([10, 255, 255])
mask = cv2.inRange(img_hsv, lower_red, upper_red)
mark_red = cv2.bitwise_and(img, img, mask=mask) # 用原来彩色图片显示
# 计算红色在整个图片中的占比
white_pixels = np.sum(mask == 255) # 计算mask中白色像素数量
total_pixels = mask.shape[0] * mask.shape[1] # 计算图片总像素数量
percentage = (white_pixels / total_pixels) * 100 # 计算占比
print("红色占比:{}%".format(percentage))
# 显示
cv2.imshow('mark_red', mark_red)
cv2.waitKey(3000)
# 写入图片
cv2.imwrite("2.png", mark_red)
关于HSV颜色范围,除了用GPT辅助,也可以手动来分析,代码如下:
red = np.uint8([[[0, 0, 255]]]) # 在BGR颜色空间中,这个表示红色
hsv_red = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print(hsv_red) # [[[ 0 255 255]]]
模板匹配
匹配一张图是不是在另一张图里面出现过,代码为 3.png 在 1.png 中出现的位置。
import cv2
import numpy as np
# 打开图片,最后表示彩色
img_big = cv2.imread('1.png', cv2.IMREAD_COLOR)
img_small = cv2.imread('3.png', cv2.IMREAD_COLOR)
# 匹配
res = cv2.matchTemplate(img_big, img_small, cv2.TM_CCOEFF_NORMED)
threshold = 0.9 # 阈值
loc = np.where(res >= threshold) # 匹配程度大于%90 的坐标 y,x
# 循环所有坐标 画框
h, w = img_small.shape[:2] # 获取匹配图的宽和高,方便画图
for pt in zip(*loc[::-1]): # *号表示可选参数
right_bottom = (pt[0] + w, pt[1] + h)
cv2.rectangle(img_big, pt, right_bottom, (0, 255, 0), 1) # PT表示左上角的坐标,right_bottom表示右下角的坐标,格式为 y,x
cv2.imshow("aa", img_big)
cv2.waitKey(3000)
# 写入图片
cv2.imwrite("2.png", img_big)