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

相关推荐
孙同学要努力2 小时前
全连接神经网络案例——手写数字识别
人工智能·深度学习·神经网络
Eric.Lee20212 小时前
yolo v5 开源项目
人工智能·yolo·目标检测·计算机视觉
其实吧33 小时前
基于Matlab的图像融合研究设计
人工智能·计算机视觉·matlab
丕羽3 小时前
【Pytorch】基本语法
人工智能·pytorch·python
ctrey_3 小时前
2024-11-1 学习人工智能的Day20 openCV(2)
人工智能·opencv·学习
SongYuLong的博客3 小时前
Air780E基于LuatOS编程开发
人工智能
Jina AI3 小时前
RAG 系统的分块难题:小型语言模型如何找到最佳断点?
人工智能·语言模型·自然语言处理
-派神-3 小时前
大语言模型(LLM)量化基础知识(一)
人工智能·语言模型·自然语言处理
johnny_hhh3 小时前
AI大模型重塑软件开发流程:定义、应用场景、优势、挑战及未来展望
人工智能
Elastic 中国社区官方博客3 小时前
释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作
大数据·数据库·人工智能·elasticsearch·搜索引擎·自然语言处理