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()

 

上一篇:Jenkins面试整理-如何配置 Jenkins Pipeline?


下一篇:.Net C# 基于EFCore的DBFirst和CodeFirst