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介绍
  1. namedWindow()             窗口标号
  2. imshow()                 窗口展示
  3. destroyAllWindows()     销毁所有窗口
  4. 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();
  • 视频采集
  1. VideoCapure()            虚拟采集器
  2. cap.read()                将视频帧处理
  3. 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 控件
  1. createTrackbar     创建TrackBar
  2. 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();
  •   色彩空间
  1. RGB与BGR
  2. RGB 人眼色彩空间
  3. OpenCV 默认使用BGR
  4. HSV/HSB/HSL 色相、饱和度、明亮度
  5. 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 图像基础操作
  1. opencv中用到的矩阵都要转换成Numpy数组
  2. Numpy是一个经高度优化的Python数值库
  • 基本操作
  1. 创建数组        array()
  2. 创建全0数组     zeros() / ones
  3. 创建全值数组     full()
  4. 创建单元数组     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)

四、车辆识别    

  • 基本图像运算处理
  • 形态学
  • 轮廓查找
  • 图像运算

            
            待续

        

        


 

  • 43
    点赞
  • 197
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值