python opencv1
一、基本参数
OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库。
安装:pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
imprort cv2
1、显示窗口
cv2.namedWindow(winname, flags=None) :winname 窗口的名称,必须唯一,最好使用英文;flags 窗口标志 默认值为 WINDOW_AUTOSIZE(窗口大小根据图像大小自动调整,不能手动调整 ),当 flags = cv2.WINDOW_NORMAL 时,自行拉动窗口调整大小。
读取图像:cv2.imread('图片路径')
显示图像:cv2.imshow('窗口名称' ,图片)
关闭窗口:cv2.destroyAllWindows()
import cv2
# 读取图像
image = cv2.imread('images/car.png')
# 创建一个名为 "Image Window" 的窗口,允许调整大小
cv2.namedWindow('window', cv2.WINDOW_NORMAL)# 根据名称重新调整该窗口的大小
cv2.resizeWindow("window", 500, 300)
# 将图像显示到指定窗口
cv2.imshow('Window', image)
# 等待用户按键 0 无限等待
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()
2、创建空白图像
图像被读取后的结果为三维数组,那么可以使用数组方法创建一个元素全部为零的三维数组。
height, width, channels = 500, 500, 3
blank_image = np.zeros((height, width, channels), dtype=np.uint8)
3、保存图片
cv2.imwrite(存入路径,图片名称) 方法(与python的文本写入类似)。
cv2.imwrite("save_images/car.png", img)
4、裁剪图片
等同于数组的切片,图片名称[纵坐标1:纵坐标2,横坐标1:横坐标2],也就是得到这块区域内的所有内容。
注意:坐标的原点在图像的左上角,也就是横坐标从左到右,纵坐标从上到下。
import cv2
ima = cv2.imread("../../images/car.png")
h, w, c = ima.shape
print(f"高度:{h},宽度:{w},通道:{c}")
# 定义坐标 ,左上角点为原点。x向右,y向下
x = 325 # x小于图片宽度
y = 164 # y小于图片高度
w = 165 # x+w 小于图片宽度
h = 60 # y+h 小于图片高度
# 使用数组的切片操作,[高度1:高度2, 宽度1:宽度2],结果为高度2-高度1,宽度2-宽度1矩形区域
cai_image = ima[y: y+h, x: x+w]
h, w, c = cai_image.shape
print(f"高度:{h},宽度:{w},通道:{c}")
cv2.imshow("image", cai_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
5、调整图片大小
cv2.resize(src, dsize, dst):src 指定需要调整的图片;dsize(width, height) 新的大小
r_ima = cv2.resize(ima, (200, 100))
6、图像绘制
cv2.circle() 、 cv2.rectangle()、 cv2.putText()、cv2.line()
6.1、圆形
cv2.circle(img, center, radius, color, thickness)
img:指定图片名称
center:圆的圆心(二维数组)
radius:半径(-1 表示实心圆)
color:圆的颜色
thickness:线条厚度
img = cv2.imread("../../images/car.png")
# 绘制圆形
center = (300, 200) # 圆心坐标
radius = 50 # 半径
color = (0, 255, 0) # 颜色为绿色
thickness = 5 # 线条厚度
cv2.circle(img, center, radius, color, thickness)# 显示带有圆形的图像
cv2.imshow('Circle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
6.2、矩形
cv2.rectangle(img, leftTop, rightFoot, color, width)
img:指定图片名称
center:圆的圆心(二维数组)
leftTop:矩形左上角顶点
rightFoot:矩形右下角顶点
color:边框颜色
width:线条宽度
img = cv2.imread("../../images/car.png")
# 绘制矩形
leftTop = (325, 164) # 左上角顶点
rightFoot = (325 + 165, 164 + 60) # 右下角顶点
color = (0, 255, 0) # 颜色为绿色
width = 2 # 线条厚度
cv2.rectangle(img, leftTop, rightFoot, color, width)
# 显示带有矩形的图像
cv2.imshow('Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
6.3、文本
putText(img, text, position, font_type, font_size, font_color, line_type)
img:指定图片名称
text:文本内容
position:文本出现的左下角位置(二维数组)
font_type:字体类型
font_size:子大小
font_color:字体颜色
line_type:字体线条粗细
image = cv2.imread("images/car.png")
text = "hello world!"
position = (50, 200)
font_type = cv2.FONT_HERSHEY_SIMPLEX
font_size = 1
font_color = (0, 255, 0)
line_type = 2
cv2.putText(image, text, position, font_type, font_size, font_color, line_type)
cv2.imshow(' Text', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
当遇到text传入汉字时,opencv无法处理,需要使用 PIL包内的Image, ImageDraw, ImageFont 三个模块处理。
处理流程:
1、进行格式转化,将opencv图像转成pil图像;
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
2、创建对象绘图;
draw = ImageDraw.Draw(pil_image)
3、加载汉字字体
font_type = "../fonts/simhei.ttf"
font = ImageFont.truetype(font_type, font_size)
4、绘制文本
draw.text(position, text, fill=font_color, font=font)
5、将处理好的图像转化成opencv图像
image1= cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)
最终代码:
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
image = cv2.imread("../../images/car.png")
text = "哈喽"
position = (50, 50)
font_type = cv2.FONT_HERSHEY_SIMPLEX
font_size = 20
font_color = (0, 255, 0)
font_line = 1
# 判断输入文本是否为汉字
def is_chinese(char):
if '\u4e00' <= char <= '\u9fff':
return True
else:
return False
def put_text(image, text, position, font_size, font_color):
global font_type
font_type = "../fonts/simhei.ttf"
# 将 OpenCV 图像转换为 PIL 图像
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))# 创建一个可以在给定图像上绘图的对象
draw = ImageDraw.Draw(pil_image)# 加载字体
font = ImageFont.truetype(font_type, font_size)# 在图像上绘制文本
draw.text(position, text, fill=font_color, font=font)# 将 PIL 图像转换回 OpenCV 图像
image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)return image_with_text
# 判断传入文本是否为汉字
if is_chinese(text):
image = put_text(image, text, position, font_size, font_color)
print("1")
else:
image = cv2.putText(image, text, position, font_type, font_size, font_color, font_line)
print("2")# 显示图像
cv2.imshow('Text', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
7、鼠标
cv2.setMouseCallback
7.1、鼠标点击
def mytest(event, x, y, flag, param):
print(f"event{event}")
print(f"坐标{(x,y)}")
print(f"flag={flag}")
print(f"param={param}")
img = cv2.imread("../../images/car.png")
# 定义窗口
cv2.namedWindow("name")
# 设置执行鼠标操作的回调函数
cv2.setMouseCallback("name", mytest)
cv2.imshow("name", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
7.2、鼠标控制
def mytest(event, x, y, flag, param):
global d
# 鼠标左键按下的事件:
if event == cv2.EVENT_LBUTTONDOWN:
print("鼠标左键按下")
d = True
elif event == cv2.EVENT_LBUTTONUP:
print("鼠标左键松开")
d = False
elif event == cv2.EVENT_MOUSEMOVE:
print("鼠标移动了")
if d == True:
cv2.circle(img, center=(x, y), radius=30, color=(0, 255, 0), thickness=-1)
img = cv2.imread("../../images/car.png")
# 定义窗口
cv2.namedWindow("name")d = False
# 设置执行鼠标操作的回调函数
cv2.setMouseCallback("name", mytest)
while True:
cv2.imshow("name", img)
if cv2.waitKey(100) == 27:
break
cv2.destroyAllWindows()
8、视频处理
cv2.VideoCapture(0),0变化更为路径可获取本地视频。
import cv2
# 0 : 开启摄像头,参数为视频路径
cap = cv2.VideoCapture(0)
while True:
# 读取视频
# ret 是否读取到视频,
# frame 图片(帧)
ret, frame = cap.read()
if ret:
cv2.imshow("name", frame)
if cv2.waitKey(20) == 27:
break
cv2.destroyAllWindows()