Day22 opencv

OpenCV

简介

全称Open Source Computer Vision Library,开源计算机视觉库,是一堆C和C++语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。

由英特尔公司主导并推进研发,,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国Willow Garage为OpenCV提供主要的支持

广泛应用于工业和科研领域,用于实时图像处理、计算机视觉和模式识别程序的开发。

OpenCV的重要性

计算机视觉包括图像识别、物体检测、人脸辨识、手势识别等

机器人科技:自动导航、环境探测、用户互动

医疗影像:图像改进、划分、特征抽取

自动驾驶技术:环境感知、障碍物侦测、车道标识辨识

安全监控功能:动态监测、面部识别、行为分析

环境安装

pip install opencv-python -i Simple Index

显示窗口

cv2.namedWindow 是 OpenCV 库中的一个函数,用于创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常有用,尤其是在开发基于图像处理的应用程序时

函数原型:cv2.namedWindow(winname, flags=None)

参数:

winname (str): 窗口名称称号,这个名称必须是唯一的,因为它是用来标识窗口的。

flags:窗口标志,用于设置窗口的行为,默认值为

cv2.WINDOW_AUTOSIZE

常见的标志包括:

cv2.WINDOW_NORMAL(可手动调整大小)

cv2.WINDOW_AUTOSIZE(自动调整大小)。

示例

opencv不支持中文,包括窗口名称和图像文件路径不支持直接使用中文字符,

可以使用Unicode字符串或Python的os模块来处理路径。

import cv2

#函数:创建窗口,名称image,cv2.WINDOW_NORMAL手动调整窗口大小

cv2.namedWindow('image', cv2.WINDOW_NORMAL)

#设置窗口大小(宽,高),名称和nameWindow一致

cv2.resizeWindow("image", 120, 190)

#读取图片,imread(图片路径)

image = cv2.imread(r'C:\Users\My Documents\opencv.png')

cv2.waitKey(0)

在OpenCV中,图片以矩阵(NumPy数组)的形式储存

if image is None:

print("未读到图片")

#用窗口显示图片

cv2.imshow('image', image)

#等待键盘操作,无限等待

cv2.waitKey(0)

while(True):

key = cv2.waitKey()

#27 指的是键盘ESC键

if key == 27:

print("终止")

break

#释放资源

cv2.destroyAllWindows()

创建空白图像

函数:np.zeros((height, width, channels), dtype=np.uint8)

示例

import cv2

import numpy as np

def text01():

#创建一个图片矩阵

#512是图片高度,511是宽度,3是通道(RGB),1是灰度图像

image = np.zeros((512,511,3), dtype = np.uint8)

print(image)

cv2.imshow("image",image)

cv2.waitKey(0)

cv2.destoryAllWindows()

text01()

保存图片

函数:cv2.imwrite(filename, img[, params])

参数:

filename:保存的文件路径和名称

img:要保存的图像

示例

import cv2

#读取图片

im= cv2.imread(r'C:\Users\My Documents\opencv.png')

#保存图片:imwrite(保存图片路径,图像矩阵),返回布尔值

iss = cv2.imwrite("save.jpg",im)

if iss == True:

print("保存成功")

else:

print("保存失败")

图像切片(裁剪)

语法:img[y:y+h, x:x+w]

参数:

x:子区域左上角的x坐标

y:子区域左上角的y坐标

w:子区域的宽度

h:子区域的高度

示例

import cv2

img = cv2.imread(r'C:\Users\My Documents\opencv.png')

#获取图片的像素

h,w,c = img.shape

print(f"高度:{h},宽度:{w}, 通道:{c}")

#定义坐标

x= 50 #x坐标小于图片的宽度

y = 50 #y坐标小于图片的高度

w = 80 #w,h裁剪后图片的像素

h = 130

cai_img = img[y:y+h,x:x+w]

#获取图片的像素

ch,cw,cc = cai_img.shape

print(f"高度:{ch},宽度:{cw},通道:{cc}")

cv2.imshow('old', img)

cv2.imshow('image', cai_img)

cv2.waitKey(0)

cv2.destroyAllWindows()

调整图片大小

函数:cv2.resize(src, dsize, dst)

参数:

src:输入图像

dsize:输出图像的尺寸

示例

import cv2

img = cv2.imread("images/car.png")

height, width, channels = img.shape

print(f"高度:{height},宽度:{width},通道数:{channels}")

img = cv2.resize(img, (300, 300))

height, width, channels = img.shape

print(f"调整后:高度:{height},宽度:{width},通道数:{channels}")

cv2.imwrite("save_image/car.png", img)

图像绘制

绘制圆形

函数:cv2.circle(img, center, radius, color, thickness)

参数:

img:要绘制圆形的图像

center:圆心的坐标

radius:圆的半径

color:圆的颜色

thickness:圆的边界线条的厚度

示例

import cv2

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

绘制矩形

函数:cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

参数:

img:要绘制矩形的图像

pt1:矩形的一个顶点

pt2:矩形对角线上的另一个顶点

color:矩形的颜色

thickness:矩形边框的厚度

示例

import cv2

import numpy as np

img = np.zeros((200,500,3),dtype=np.uint8)

#定义绘制矩形的左上角坐标

left_top = (100,100)

#定义绘制矩形的右下角坐标

right_bottom = (300,200)

#定义颜色

color = (0,0,255)

#定义线条宽度

w = 5

#画矩形

r_img = cv2.rectangle(img,left_top,right_bottom,color,w)

cv2.imshow("a",r_img)

cv2.waitKey(0)

cv2.destroyAllWindows()

绘制文本

函数:cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

参数:

img:输入图像

text:要添加的文本字符串

org:文本的起始位置

fontFace:字体类型

fontScale:字体大小的比例因子

color:文本颜色

thickness:文本线条的厚度

示例

import cv2

import numpy as np

from PIL import Image,ImageDraw,ImageFont

def put_text(image, text, position, font_path, font_size, color):

将 OpenCV 图像转换为 PIL 图像

pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

创建一个可以在给定图像上绘图的对象

draw = ImageDraw.Draw(pil_image)

加载字体

font = ImageFont.truetype(font_path, font_size)

在图像上绘制文本

draw.text(position, text, fill=color, font=font)

将 PIL 图像转换回 OpenCV 图像

image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)

return image_with_text

img = cv2.imread(r'C:\Users\My Documents\car.png')

#定义字体的文本内容

text = "后"

#起始坐标

c = (100,200)

#字体格式

f = cv2.FONT_HERSHEY_PLAIN

#字体大小

size = 2

#字体粗细

w = 1

#字体颜色

color = (0,0,255)

#写字

#c_img = cv2.putText(img,text=text,org=c,fontScale=size,fontFace=f,color=color,thickness=w)

#换成中文

font_path ="font/simhei.ttf"

c_img = put_text(img,"你好世界",c,font_path,30,color)

cv2.imshow("a",c_img)

cv2.waitKey(0)

cv2.destroyAllWindows()

绘制直线

函数:cv2.line(img, pt1, pt2, color, thickness)

参数:

img:输出图像

pt1:直线的一个端点

pt2:直线的另一个端点

color:直线的颜色

thickness:直线的宽度

示例

import cv2

img = cv2.imread("images/car.png")

start_point = (50, 50)

end_point = (450, 450)

color = (255, 0, 0)

thickness = 2

cv2.line(img, start_point, end_point, color, thickness)

cv2.imshow('Image with Line', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

控制鼠标

函数:cv2.setMouseCallback(windowName, onMouse[, param])

参数:

windowName:窗口名称

onMouse:鼠标回调函数

param:传递给回调函数的参数

示例

import cv2

#鼠标回调函数

#event 鼠标事件

#x,y 鼠标在图形区域所在的坐标

#flag:标识

#param 参数

def mytext(event, x, y, flag, param):

print(f"坐标{(x,y)}")

print(f"flag={flag}")

print(f"param={param}")

img = cv2.imread(r'C:\Users\My Documents\car.png')

#定义窗口

cv2.namedWindow('name')

#设置执行鼠标操作的回调函数

cv2.setMouseCallback('name', mytext)

cv2.imshow("name",img)

cv2.waitKey(0)

cv2.destroyAllWindows()

视频处理

类:cv2.VideoCapture

常用方法:

read():读取下一帧

release():释放视频捕获资源

isOpened():检查视频捕获对象是否已成功打开

get() 和 set():获取和设置视频捕获属性

示例

import cv2

video_capture = cv2.VideoCapture('video/1.mp4')

if not video_capture.isOpened():

print("视频没有打开")

exit()

fps = video_capture.get(cv2.CAP_PROP_FPS)

delay = int(1000 / fps)

while True:

ret, frame = video_capture.read()

cv2.imshow('Video', frame)

if cv2.waitKey(delay) & 0xFF == ord('q'):

break

video_capture.release()

cv2.destroyAllWindows()

解决OpenCV显示中文乱码问题

方法:使用PIL库处理中文文本

示例

import cv2

from PIL import Image, ImageDraw, ImageFont

import numpy as np

def put_text(image, text, position, font_path, font_size, color):

pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

draw = ImageDraw.Draw(pil_image)

font = ImageFont.truetype(font_path, font_size)

draw.text(position, text, fill=color, font=font)

image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)

return image_with_text

image = cv2.imread('images/car.png')

text = "你好,世界!"

position = (50, 50)

font_path = "myfont/simhei.ttf"

font_size = 30

color = (0, 0, 255)

image_with_text = put_text(image, text, position, font_path, font_size, color)

cv2.imshow('Image with Text', image_with_text)

cv2.waitKey(0)

cv2.destroyAllWindows()

相关推荐
dundunmm9 分钟前
数据挖掘之认识数据
人工智能·机器学习·信息可视化·数据挖掘
FBI780980459428 分钟前
API接口在电商行业中的创新应用与趋势
运维·网络·人工智能·爬虫·python
Sword9932 分钟前
豆包 MarsCode AI Apply功能揭秘:自动代码应用与 Diff 实现
前端·人工智能·豆包marscode
梁小憨憨32 分钟前
机器学习(Machine Learning)的安全问题
人工智能·安全·机器学习
编码小哥1 小时前
深入解析Mat对象:计算机视觉中的核心数据结构
opencv·计算机视觉
Gauss松鼠会1 小时前
GaussDB数据库中SQL诊断解析之配置SQL限流
数据库·人工智能·sql·mysql·gaussdb
愚者大大1 小时前
1. 深度学习介绍
人工智能·深度学习
Byron Loong2 小时前
Python+OpenCV系列:【打卡系统-工具模块设计】工具模块深度揭秘,考勤智能化的核心秘籍!
python·opencv·webpack
liuming19922 小时前
Halcon中histo_2dim(Operator)算子原理及应用详解
图像处理·人工智能·深度学习·算法·机器学习·计算机视觉·视觉检测