OpenCV 车辆检测/人脸识别+图像拼接+文字识别
Posted jartin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 车辆检测/人脸识别+图像拼接+文字识别相关的知识,希望对你有一定的参考价值。
一、开发环境搭建
命令行安装方式 - mac
brew install python@3.9
pip3 install numpy matplotlib opencv_python
// numpy - 矩阵操作
// matplotlib - 显示
// 测试是否安装成功(import 无报错信息 表示安装成功)
MacintoshdeMacBook-Pro:~ Jartin$ python3
Python 3.9.1 (default, Jan 8 2021, 17:15:36)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> import matplotlib
>>> import cv2
二、图像 视频加载与展示
- API介绍
- namedWindow() 窗口标号
- imshow() 窗口展示
- destroyAllWindows() 销毁所有窗口
- resizeWindow 窗口大小
import cv2;
# 创建窗口
cv2.namedWindow('new', cv2.WINDOW_NORMAL);
# WINDOW_AUTOSIZE 不可以resize
# WINDOW_NORMAL 可以resize
# 设定窗口大小
cv2.resizeWindow('new', 1920, 1080)
# 展示窗口
cv2.imshow('new', 0);
# 键盘和鼠标的监听 实现
key = cv2.waitKey(0)
if(key == 'q'):
exit()
# 销毁所有窗口
cv2.destroyAllWindows();
import cv2;
# 图片加载
cv2.namedWindow('img', cv2.WINDOW_NORMAL);
img = cv2.imread('./jobs.jpeg');
cv2.imshow('img', img)
key = cv2.waitKey(0)
if (key & 0xFF == ord('q')):
cv2.destroyAllWindows();
- 视频采集
- VideoCapure() 虚拟采集器
- cap.read() 将视频帧处理
- cap.release() 释放资源
import cv2;
# 使用opencv 的 videocapture采集视频数据
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL);
cv2.resizeWindow('video', 640, 480);
# 获取视频设备
cap = cv2.VideoCapture(0);
while True:
# 从摄像头读取视频帧
ret, frame = cap.read();
# 将视频帧在窗口中显示
cv2.imshow('video', frame);
# 等待键盘事件,如果q,退出 waitKey(1)帧率越小 视频越流畅
key = cv2.waitKey(1);
if (key & 0xFF == ord('q')):
break;
# 释放VideoCapture
cap.release();
cv2.destroyAllWindows();
import cv2;
# 读取视频文件
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL);
cv2.resizeWindow('video', 640, 480);
# 获取视频设备 / 从视频文件中读取视频帧
cap = cv2.VideoCapture(0);
cap = cv2.VideoCapture('/Users/Jartin/Desktop/opencv/zl.mp4');
while True:
# 从摄像头读取视频帧
ret, frame = cap.read();
# 将视频帧在窗口中显示
cv2.imshow('video', frame);
# 等待键盘事件 如果q退出
key = cv2.waitKey(1);
if (key & 0xFF == ord('q')):
break;
# 释放rediocap
cap.release();
cv2.destroyAllWindows();
import cv2;
# 视频录制
# 创建videowrite为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'MJPG');
# 路径、 forcc、帧率、分辨率
vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1280, 720))
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL);
cv2.resizeWindow('video', 640, 360);
# 获取视频设备
cap = cv2.VideoCapture(0);
while True:
# 从摄像头读取数据
ret, frame = cap.read();
# 将视频帧在窗口显示
cv2.imshow('video', frame);
# 写数据到多媒体文件
vw.write(frame);
# 等待键盘事件 如果为q退出
key = cv2.waitKey(1);
if (key & 0xFF == ord('q')):
break;
# 释放videocapture
cap.release();
# 释放videowrite资源
vw.release();
cv2.destroyAllWindows();
import cv2;
import numpy as np;
# 控制鼠标 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata);
# 创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL);
cv2.resizeWindow('mouse', 640, 360);
# 设置鼠标回调
cv2.setMouseCallback('mouse', mouse_callback, '123');
# 显示窗口和背景
# numpy图片组件、np.zeros显示图片、(高, 宽, bgr3种数组)、np.uint8像素类型
img = np.zeros((360, 640, 3), np.uint8);
while True:
cv2.imshow('mouse', img);
key = cv2.waitKey(1);
if key & 0xFF == ord('q'):
break;
cv2.destroyAllWindows();
- TrackBar 控件
- createTrackbar 创建TrackBar
- getTrackPos 获取TrackBar
import cv2;
import numpy as np;
def callback():
pass;
# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL);
# 创建trackbar 名字、窗口名字、默认当前值、最大值、回调方法
cv2.createTrackbar('R', 'trackbar', 0, 255, callback);
cv2.createTrackbar('G', 'trackbar', 0, 255, callback);
cv2.createTrackbar('B', 'trackbar', 0, 255, callback);
# 创建图片
img = np.zeros((480, 640, 3), np.uint8);
while True:
# 读取值
r = cv2.getTrackbarPos('R', 'trackbar');
g = cv2.getTrackbarPos('G', 'trackbar');
b = cv2.getTrackbarPos('B', 'trackbar');
img[:] = [b, g, r];
cv2.imshow('trackbar', img);
key = cv2.waitKey(10);
if key & 0xFF == ord('q'):
break;
cv2.destroyAllWindows();
- 色彩空间
- RGB与BGR
- RGB 人眼色彩空间
- OpenCV 默认使用BGR
- HSV/HSB/HSL 色相、饱和度、明亮度
- YUV 视频存储
import cv2;
import numpy as np;
def callback():
pass;
# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL);
# 创建trackbar 名字、窗口名字、默认当前值、最大值、回调方法
cv2.createTrackbar('R', 'trackbar', 0, 255, callback);
cv2.createTrackbar('G', 'trackbar', 0, 255, callback);
cv2.createTrackbar('B', 'trackbar', 0, 255, callback);
# 创建图片
img = np.zeros((480, 640, 3), np.uint8);
while True:
# 读取值
r = cv2.getTrackbarPos('R', 'trackbar');
g = cv2.getTrackbarPos('G', 'trackbar');
b = cv2.getTrackbarPos('B', 'trackbar');
img[:] = [b, g, r];
cv2.imshow('trackbar', img);
key = cv2.waitKey(10);
if key & 0xFF == ord('q'):
break;
cv2.destroyAllWindows();
HSV Hue:色相、红色、蓝色、绿色
Saturation:饱和度,颜色的纯度
Value:明度
YUV 视频中常用
对像素的描述 Y数据 UV彩色信息
- 色彩空间转换
import cv2;
def callback():
pass;
cv2.namedWindow('color', cv2.WINDOW_NORMAL);
img = cv2.imread('./jobs.jpeg');
colorspaces = [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGR2BGRA, cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV, cv2.COLOR_BGR2YUV];
cv2.createTrackbar('curcolor', 'color', 0, 4, callback);
while True:
index = cv2.getTrackbarPos('curcolor', 'color');
# 颜色空间转换API
cvt_img = cv2.cvtColor(img, colorspaces[index]);
cv2.imshow('color', img)
key = cv2.waitKey(10);
if key & 0xFF == ord('q'):
break;
cv2.destroyAllWindows();
- Numpy 图像基础操作
- opencv中用到的矩阵都要转换成Numpy数组
- Numpy是一个经高度优化的Python数值库
- 基本操作
- 创建数组 array()
- 创建全0数组 zeros() / ones
- 创建全值数组 full()
- 创建单元数组 identity / eye()
import numpy as np
# np.zeros((行的个数, 列的个数, 通道数/层数), 矩阵中的数据类型);
c = np.zeros((480, 640, 3), np.uint8);
print(c)
矩阵的检索与赋值
ROI [y1:y2,x1:x2]
Mat是什么
是矩阵,可以理解为一张图 有head 与 body组成
- Mat的深拷贝与浅拷贝
import cv2
import numpy as np
img = cv2.imread('./1.jpeg');
# 浅拷贝
img2 = img;
# 深拷贝
img3 = img.copy();
img[10:100, 10:100] = [0, 0, 255]
cv2.imshow('img', img)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey(0);
- 图像的多种属性
import cv2;
import numpy as numpy
img = cv2.imread('./1.jpeg')
# (1200, 1920, 3) 高度、长度、通道数
print(img.shape)
# 6912000 高度 * 长度 * 3
print(img.size)
# uint8 图像中每个元素的位深
print(img.dtype)
- 通道的分离与合并
import cv2;
import numpy as np
# 通道的分离与合并
img = np.zeros((480, 640, 3), np.uint8)
b,g,r = cv2.split(img);
b[10:100, 10:100] = 255;
g[10:100, 10:100] = 255;
img2 = cv2.merge((b, g, r))
cv2.imshow('img', img);
cv2.imshow('b', b);
cv2.imshow('g', g);
cv2.imshow('img2', img2);
cv2.waitKey(0);
三、绘制基本图形
- 线、矩形、圆
- 椭圆、多边形、绘制字体
import cv2;
import numpy as np;
# 绘制直线
img = cv2.imread('./1.jpeg')
cv2.line(img, (10, 20), (10, 900), (0,0,255), 20, 4);
cv2.line(img, (100, 12), (400, 100), (0,0,255), 20, 14);
cv2.imshow('img', img);
key = cv2.waitKey(0);
import cv2;
import numpy as np;
img = cv2.imread('./1.jpeg');
# cv2.ellipse(img, (500, 500), )
# 画圆
cv2.circle(img, (520, 440), 100, (0, 0, 255), 10)
cv2.circle(img, (520, 440), 5, (0, 0, 255), 10)
# 画椭圆
# 度是按顺时针计算的
cv2.ellipse(img, (520, 440), (100, 50), 15, 0, 360, (0, 0, 255), -1)
# 画多边形
pts = np.array(((320, 10), (150, 100), (450, 100)), np.int32)
cv2.polylines(img, [pts], True, (0, 0, 255))
# 填充
cv2.fillPoly(img, [pts], (255, 255, 0))
# 绘制文本
cv2.putText(img, 'Yulanlan', (800, 400), cv2.FONT_HERSHEY_PLAIN, 9, (255, 0, 0))
cv2.imshow('draw', img);
cv2.waitKey(0)
四、车辆识别
- 基本图像运算处理
- 形态学
- 轮廓查找
- 图像运算
待续
以上是关于OpenCV 车辆检测/人脸识别+图像拼接+文字识别的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenCV与 HAAR 级联算法进行人脸检测和人脸识别
AI人脸识别/车辆识别智能分析网关微信端告警消息推送的开发流程