一、OpenCV的介绍及优势
1、介绍
OpenCV是一款由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法,并且正在日益扩展
2、优势
-
编程语言
OpenCV基于C++实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API,结合了OpenCV C++ API和Python语言的最佳特性。
-
跨平台
可以在不同的系统平台上使用,包括Windows,Linux,OS X,Android和iOS。基于CUDA和OpenCL的高速GPU操作接口也在积极开发中
-
活跃的开发团队
-
丰富的API
完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。
二OpenCV的基础图像操作
1、读取图像和显示图片
读取API:cv2.imread
显示API: cv2.imshow
cv2.waitKey
注意:在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来
import cv2
img=cv2.imread("./src/1.jpg")#读取图片
cv2.imshow("img",img)#显示图片
cv2.waitKey(0)#给图片绘制留下时间,不然无法显示
当cv2.waitKey(x)中时间x大于0时则显示xms,如果x=0,则一直显示直到有人按下键盘。
2、图像的保存
API:cv2.imwrite(arg1,arg2)
arg1:文件名,要保存在哪里
arg2:要保存的图像
import cv2
img=cv2.imread("./src/1.jpg")#读取图片
cv2.imshow("img",img)#显示图片
cv2.imwrite("./src/1-1.jpg",img)#保存图像img到./src/1-1.jpg路径下
cv2.waitKey(0)#给图片绘制留下时间,不然无法显示
三、绘制几何图像
1、绘制直线
API:cv2.line(img,start,end,color,thickness)
-
img:要绘制直线的图像
-
Start,end: 直线的起点和终点
-
color: 线条的颜色
-
Thickness: 线条宽度
import cv2
img=cv2.imread("./src/1.jpg")
cv2.line(img,(100,100),(200,200),(0,0,255),5)#图片,起始位置,结束位置,颜色,线条粗细
cv2.imshow("img",img)
cv2.waitKey(0)
2、绘制圆形
API:cv.circle(img,centerpoint, r, color, thickness)
-
img:要绘制圆形的图像
-
Centerpoint, r: 圆心和半径
-
color: 线条的颜色
-
Thickness: 线条宽度,为-1时生成闭合图案并填充颜色
import cv2
img=cv2.imread("./src/1.jpg")
cv2.circle(img,(500,500),100,(255,100,0),5)#图片,圆心,半径,颜色,线条粗细
cv2.imshow("img",img)
cv2.waitKey(0)
3、绘制矩形
API:cv.rectangle(img,leftupper,rightdown,color,thickness)
-
img:要绘制矩形的图像
-
Leftupper, rightdown: 矩形的左上角和右下角坐标
-
color: 线条的颜色
-
Thickness: 线条宽度
import cv2
img=cv2.imread("./src/1.jpg")
cv2.rectangle(img,(100,100),(500,500),(255,255,0),5)#图片,矩形左上角,矩形右上角,颜色,粗细
cv2.imshow("img",img)
cv2.waitKey(0)
4、向图像中添加文字
API:cv.putText(img,text,station, font, Fontscale ,color,thickness,cv2.LINE_AA)
-
img: 图像
-
text:要写入的文本数据
-
station:文本的放置位置
-
font:字体样式
-
Fontscale :字体大小
-
thickness字体线条宽度
-
cv2.LINE_AA:可以减少文字锯齿状效果
import cv2
img=cv2.imread("./src/1.jpg")
cv2.putText(img,"cat",(200,200),cv2.FONT_HERSHEY_COMPLEX,5,(255,0,0),5,cv2.LINE_AA)#图片,写入的信息,字体(输入cv2.FONT会弹出字体提示),字体大小,颜色,子图线条宽度
cv2.imshow("img",img)
cv2.waitKey(0)
(1)想在图片中加入中文需要引用 Pillow (PIL) 库
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
# 读取图片(OpenCV格式)
img_cv = cv2.imread("input.jpg")
# 将OpenCV的BGR格式转为RGB格式(Pillow需要)
img_pil = Image.fromarray(cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB))
# 创建一个Draw对象
draw = ImageDraw.Draw(img_pil)
# 指定字体文件(必须提供中文字体路径,如微软雅黑)
font_path = "msyh.ttc" # 替换为你的中文字体文件
font_size = 30
font = ImageFont.truetype(font_path, font_size)
# 定义文字内容、位置和颜色
text = "你好,世界!"
position = (50, 50) # (x, y)
color = (255, 0, 0) # RGB颜色(红色)
# 绘制中文
draw.text(position, text, font=font, fill=color)
# 转回OpenCV格式(BGR)
img_cv_with_text = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)
# 保存或显示
cv2.imwrite("output.jpg", img_cv_with_text)
cv2.imshow("Image with Chinese", img_cv_with_text)
cv2.waitKey(0)
5、获取并修改图像中的像素点
import cv2
img=cv2.imread("./src/1.jpg")
img[20:30]=[255,0,0]
cv2.imshow("window1",img)
cv2.waitKey(0)
6、捕获摄像头的实时视频流
API:cap = cv2.VideoCapture(path)
path视频流资源路径设置为0代表从默认摄像头捕获视频流
API:ret, frame = cap.read()
返回值cap 调用read()方法可以得到一个布尔值和一帧图像。布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败;如果为True,第二项则是当前帧的图像数据。
import cv2
# 创建VideoCapture对象,参数为摄像头索引(通常为0,如果是单一摄像头)
cap = cv2.VideoCapture(0)
while True:
# 读取一帧视频
ret, frame = cap.read()
# 检查读取是否成功
if not ret:
break
# 在这里处理或显示帧(例如,显示原始帧)
cv2.imshow('Camera Feed', frame)
# 按'q'键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头资源并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
四、灰度实验
1、最大值法
将图片中每个像素点的RGB三项中最大的一项作为灰度值
import cv2
import numpy as np
path="./src/1.jpg"
img=cv2.imread(path)
h,w,c=img.shape
img_gray=np.zeros((h,w),dtype=np.uint8)
for row in range(h):
for col in range(w):
b,g,r=img[row,col]
max_value=max(b,g,r)
img_gray[row,col]=max_value
cv2.imshow("img_gray",img_gray)
cv2.imshow("img",img)
cv2.waitKey(0)
2、平均值法
对于彩色图像的每个像素,它会将R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。
import cv2
import numpy as np
img=cv2.imread("./src/1.jpg")
h,w,c=img.shape
img_gray=np.zeros((h,w),dtype=np.uint8)
for row in range(h):
for col in range(w):
b,g,r=img[row,col]
max_value=(b+g+r)//3
img_gray[row,col]=max_value
cv2.imshow("img_gray",img_gray)
cv2.imshow("img",img)
cv2.waitKey(0)
3、加权均值法
对于彩色图像的每个像素,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。
import cv2
import numpy as np
"加权求和法灰度处理"
img=cv2.imread("./src/1.jpg")
h,w,c=img.shape
img_gray=np.zeros((h,w),dtype=np.uint8)
for row in range(h):
for col in range(w):
b,g,r=img[row,col]
# print(px,"===========")
# break
max_value=0.3*b+0.6*g+0.112*r
# print(max_value)
img_gray[row,col]=max_value
cv2.imshow("img_gray",img_gray)
cv2.imshow("img",img)
cv2.waitKey(0)