基于opencv与机器学习的摄像头实时识别数字!附带完整的代码、数据集和训练模型!!

这篇具有很好参考价值的文章主要介绍了基于opencv与机器学习的摄像头实时识别数字!附带完整的代码、数据集和训练模型!!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

使用摄像头实时识别数字算是目标检测任务,总体上分为两步,第一步是检测到数字卡片的位置,第二步是对检测到的数字卡片进行分类以确定其是哪个数字。在第一步中主要涉及opencv的相关功能,第二步则使用机器学习的方式进行分类。

一、使用opencv捕捉(检测)数字卡片

重点操作是使用轮廓查找函数,获取数字卡片的外轮廓。

在获取轮廓前的图像预处理步骤需要根据自己的实际应用场景进行调整。

import cv2
import imutils


# 开启外接摄像头
cap = cv2.VideoCapture(1)
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
while True:
    flag, frame = cap.read()
    if frame is None:
        continue
    if flag is True:
        frame_copy = frame.copy()
        frame_copy_2 = frame.copy()
        frame_copy_3 = frame.copy()
        # 自动阈值处理
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        frame_ths = cv2.threshold(frame_gray, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]
        # 闭操作
        img_closed = cv2.morphologyEx(frame_ths, cv2.MORPH_CLOSE, rectKernel)
        # canny边缘检测;这里使用的imutils包,也可以使用opencv自带的canny
        temp = imutils.auto_canny(img_closed)
        # 轮廓查找
        contours, hierarchy = cv2.findContours(temp, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
        # 计算轮廓
        for index, c in enumerate(contours):
            area = cv2.contourArea(c)
            x, y, w, h = cv2.boundingRect(c)
            # 通过判断轮廓的外接矩形面积确定数字卡片的轮廓,实现过滤功能
            if area > 10000:
                # img_out = cv2.drawContours(frame_copy, contours, index, (0, 0, 255), 2)
                img_out = cv2.rectangle(frame_copy, (x, y), (x + w, y + h), (0, 0, 255), 2)
        cv2.imshow("ths", frame_ths)
        cv2.imshow("canny", temp)
        cv2.imshow("closed", img_closed)
        cv2.imshow("lun kuo", frame_copy)
        if cv2.waitKey(1) & 0xFF == 27:
            cap.release()
            cv2.destroyAllWindows()
            break

效果图如下:
基于opencv与机器学习的摄像头实时识别数字!附带完整的代码、数据集和训练模型!!,opencv,机器学习,目标检测,计算机视觉,python

二、制作数据集

在获取数字卡片轮廓的基础上,保存轮廓区域内的图片信息作为基础数据集。为了方便保存,可以使用pynput包完成键盘监控功能,按下一次回车即拍摄一张。

from pynput.keyboard import Key, Listener
import cv2
import imutils


# 按键获取数据集
global res_img
counts = 0    # 图片计数
def on_press(key):
    global counts
    # 回车触发
    if key == Key.enter:
        # 保存图片路径
        cv2.imwrite(f"1/1_{counts}.png", res_img)
        counts += 1
        print(f"Save sucess {counts}")

# 开启键盘监听
listener = Listener(on_press=on_press)
listener.start()

cap = cv2.VideoCapture(1)
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
while True:
    flag, frame = cap.read()
    if frame is None:
        continue
    if flag is True:
        frame_copy = frame.copy()
        frame_copy_2 = frame.copy()
        # 自动阈值处理
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        frame_ths = cv2.threshold(frame_gray, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]
        # 闭操作
        img_closed = cv2.morphologyEx(frame_ths, cv2.MORPH_CLOSE, rectKernel)
        # canny边缘检测
        temp = imutils.auto_canny(img_closed)
        # 轮廓查找
        contours, hierarchy = cv2.findContours(temp, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
        # 计算轮廓
        for index, c in enumerate(contours):
            area = cv2.contourArea(c)
            x, y, w, h = cv2.boundingRect(c)
            if area > 10000:
                img_out = cv2.rectangle(frame_copy, (x, y), (x + w, y + h), (0, 0, 255), 2)
                # 获取轮廓区域的图像
                res_img = frame_copy_2[y:y+h, x:x+w]
        cv2.imshow("lun kuo", frame_copy)
        if cv2.waitKey(1) & 0xFF == 27:
            cap.release()
            cv2.destroyAllWindows()
            listener.stop()
            break

每一个数字都要拍摄多张不同角度的图片,这个数据集的拍摄质量将影响最终识别的效果,所以拍摄时需要考虑实际的应用场景。

保存后的图片应该如下图所示。
基于opencv与机器学习的摄像头实时识别数字!附带完整的代码、数据集和训练模型!!,opencv,机器学习,目标检测,计算机视觉,python

拍摄完之后,最好再对数据集进行数据增强,以扩充数据集,提高模型的训练效果。

使用albumentations包进行数据增强,其具体的使用方式可以去Albumentations Documentation查看。

import albumentations as A
import cv2
import os

# 设置需要使用的数据增强方式
transform = A.Compose([
    A.Resize(height=128, width=128),    # 图片缩放
    A.Rotate(limit=[-70, 70], p=0.5),   # 随机旋转
    A.RandomBrightnessContrast(p=0.3),  # 随机亮度对比度
])

# 遍历每一个数字文件夹
for i in range(1, 9):
    # 图片计数
    counts = 0
    img_list = os.listdir(f"data/{i}")
    for temp in img_list:
        image = cv2.imread(f"data/{i}/{temp}")
        image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        transformed = transform(image=image)['image']
        # 保存数据增强后的图片
        cv2.imwrite(f"data/{i}/{i}_{counts}.png", transformed)
        counts += 1

在数据增强后,每个数字的数据集为220张。

三、使用sklearn建立机器学习模型实现数字分类

常用的机器学习分类模型有KNN和SVM等,可以都试一下,选择效果最好的一个。

首先需要对数据集进行预处理

import cv2
import os
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import joblib


X_img = []    # 用于存放图片信息
y_img = []    # 用于存放标签(label)信息

# 遍历加载数据集
for i in range(1, 9):
    img_list = os.listdir(f"data/{i}")
    for temp in img_list:
        image = cv2.imread(f"data/{i}/{temp}")
        image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        image = cv2.resize(image, (128, 128))
        X_img.append(image)
        y_img.append(i)

# 转换成二维数组   (1758, 128, 128) ==> (1758, 16384)
X_img = np.array(X_img).reshape(len(X_img), -1)
y_img = np.array(y_img)
print(X_img.shape)
print(y_img.shape)

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X_img, y_img, test_size=0.2)

# PCA降维 可以降低计算量,提高训练速度,减小模型大小
transfer = PCA(n_components=300)
X_train = transfer.fit_transform(X_train)
X_test = transfer.transform(X_test)
print(X_train.shape)
print(X_test.shape)

# 保存PCA降维信息,后续在实时预测时会使用到该信息
joblib.dump(transfer, 'pca_model.joblib')

之后建立SVM分类模型并进行训练和测试。

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score


# 建立svm分类器
svm = SVC(kernel='linear')
# 使用训练数据来训练SVM分类器
svm.fit(X_train, y_train)

# 使用测试数据进行预测
y_pred = svm.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
# 最终准确率为0.9573863636363636
print("Accuracy:", accuracy)
# 保存训练好的模型
joblib.dump(svm, 'svm_model_PCA300.joblib')

最后进行单张图片预测,查看预测效果。

import joblib
import cv2

# 加载SVM分类模型
loaded_svm = joblib.load('svm_model_PCA300.joblib')
# 加载PCA降维模型
loaded_pca = joblib.load('pca_model.joblib')
# 读取图片并进行预处理
img = cv2.imread("data/4/4_39.png")
img = cv2.resize(img, (128, 128))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
temp = img.reshape(1, -1)
# PCA降维,保证格式与训练数据相同
temp = loaded_pca.transform(temp)
print(temp.shape)
y_new_pred = loaded_svm.predict(temp)

# 输出预测结果
print("Predictions for new data:", y_new_pred)

四、摄像头实时预测

将前面的部分结合起来就可以实现摄像头实时预测的任务了。

import cv2
import imutils
from pynput.keyboard import Key, Listener
import joblib


# 加载SVM和PCA模型
loaded_svm = joblib.load('svm_model_PCA300.joblib')
loaded_pca = joblib.load('pca_model.joblib')

# 显示字体配置
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
font_thickness = 2
color = (0, 255, 0)

cap = cv2.VideoCapture(1)
rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (11, 11))
while True:
    flag, frame = cap.read()
    if frame is None:
        continue
    if flag is True:
        frame_copy = frame.copy()
        frame_copy_2 = frame.copy()
        # 自动阈值处理
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        frame_ths = cv2.threshold(frame_gray, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)[1]
        # 闭操作
        img_closed = cv2.morphologyEx(frame_ths, cv2.MORPH_CLOSE, rectKernel)
        # canny边缘检测
        temp = imutils.auto_canny(img_closed)
        # 轮廓查找
        contours, hierarchy = cv2.findContours(temp, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
        # 计算轮廓
        for index, c in enumerate(contours):
            area = cv2.contourArea(c)
            x, y, w, h = cv2.boundingRect(c)
            if area > 10000:
                img_out = cv2.rectangle(frame_copy, (x, y), (x + w, y + h), (0, 0, 255), 2)
                res_img = frame_copy_2[y:y+h, x:x+w]
                # 图像预处理
                img = cv2.resize(res_img, (128, 128))
                img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                temp = img.reshape(1, -1)
                # PCA降维
                temp = loaded_pca.transform(temp)
                y_new_pred = loaded_svm.predict(temp)
                cv2.putText(frame_copy, f"Pred: {y_new_pred}", (int(x), int(y)),
                            font, font_scale, color, font_thickness)

        cv2.imshow("lun kuo", frame_copy)
        if cv2.waitKey(1) & 0xFF == 27:
            cap.release()
            cv2.destroyAllWindows()
            break

基于opencv与机器学习的摄像头实时识别数字!附带完整的代码、数据集和训练模型!!,opencv,机器学习,目标检测,计算机视觉,python

五、完整的代码、数据集和训练模型下载地址

蓝奏云下载地址

CSDN下载地址文章来源地址https://www.toymoban.com/news/detail-618988.html

到了这里,关于基于opencv与机器学习的摄像头实时识别数字!附带完整的代码、数据集和训练模型!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Raspberry Pi和双目摄像头的无人机目标识别、跟踪与实时测距系统开发

    硬件选择: Raspberry Pi 4: 它是一款功能强大的微型计算机,可以轻松地与各种传感器和摄像头配合使用。 双目摄像头: 例如选择Raspberry Pi相容的Arducam双目摄像头,双目摄像头可以捕捉到两个略有差异的图像,这对于空间测距非常重要。 算法: 使用**立体视觉(Stereo Vision)**算法

    2024年02月12日
    浏览(31)
  • 智能零售柜商品识别从零开始使用YOLOv5+PyQt5+OpenCV实现(支持图片、视频、摄像头实时检测)

    全流程 教程,从数据采集到模型使用到最终展示。若有任何疑问和建议欢迎评论区讨论。 先放上最终实现效果 检测效果 智能零售柜商品识别,当顾客将自己选购的商品放置在制定区域的时候,能精准地识别每一个商品,从而能够返回完整地购物清单及计算顾客应付的实际商

    2024年02月08日
    浏览(33)
  • 基于opencv第三方视觉库,通过内网IP调用手机摄像头,实现人脸识别与图形监测

    OpenCV 是一个开源的计算机视觉库,OpenCV 库用C语言和 C++ 语言编写,可以在 Windows、Linux、Mac OS X 等系统运行。同时也在积极开发 Python、Java、Matlab 以及其他一些语言的接口,将库导入安卓和 iOS 中为移动设备开发应用。 OpenCV 库包含从计算机视觉各个领域衍生出来的 500 多个函

    2024年02月09日
    浏览(29)
  • 毕业设计:基于深度学习的摄像头人脸识别系统 人工智能

    目录 前言 课题背景和意义 实现技术思路 一、算法理论基础 1.1 人脸检测技术 1.2 活体检测技术 二、 数据集 2.1 数据集 2.2 数据扩充 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就

    2024年04月27日
    浏览(30)
  • OpenCV获取网络摄像头实时视频流

    参考文章: [常用工具] OpenCV获取网络摄像头实时视频流_opencv网络摄像头 [常用工具] OpenCV获取网络摄像头实时视频流_opencv网络摄像头_落痕的寒假的博客-CSDN博客 在使用OpenCv处理视频时,无论是视频文件还是摄像头画面,都要使用VideoCapture类来进行每一帧图像的处理。当我们

    2024年02月01日
    浏览(28)
  • RK3568-USB摄像头实时AI物品识别

    RK3568具有1TOPS算力的NPU,可以在板子上进行AI计算。飞凌OK3568板子资料中自带了一些AI识别的例子,但只是对一张图片进行识别,且需要单独使用图片查看工具查看识别结果。 为了更直观的体验RK3568的AI算力,将AI识别例程与摄像头功能结合起来,对摄像头的每一帧图像进行物

    2024年02月10日
    浏览(42)
  • 使用 MFC 和 OpenCV 实现实时摄像头视频显示

    1、引言 MFC 是一个在 Windows 平台上编写 C++ 应用程序的库,提供了丰富的用户界面功能。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,包含了丰富的图像处理和计算机视觉功能。本文将向大家展示如何将这两个库结合起来,实现一个实时显示摄像头画面的简

    2024年02月13日
    浏览(52)
  • 【Python】【OpenCV】Cameo项目(一)实时显示摄像头帧

    1、实时捕获并显示摄像头帧。 2、具备截图、保存视频和退出 三个功能键 。  要求存在文件:manager.py 和 cameo.py   两个类:CaptureManager、WindowManager   CaptureManager负责 摄像头帧的捕获 , 编解码得到实际帧 , 当前帧保存为图片 、 一段时间内的帧保存为视频 这四个核心功能

    2024年02月05日
    浏览(26)
  • Pyqt5+Opencv实现摄像头图像的实时读取并显示

    QTimer在界面中不可见,在UI设计器中也找不到它,只能通过纯代码实现,主要作用是定时特定的时间。 想要掌握QTimer只需掌握setInterval(设置定时时间,单位ms)、start(启动定时器),和定时时间到时所发出的信号timeout()即可。程序设计的思路: 1.先设定定时周期 2.绑定timeout()信号

    2024年02月04日
    浏览(34)
  • Python - OpenCV实现摄像头人脸识别(亲测版)

    要使用Python 3和OpenCV进行摄像头人脸识别,您可以按照以下步骤进行操作: 0.安装OpenCV软件 去官网直接下载安装即可,如果是C++使用OpenCV,需要使用编译源码并配置环境变量。 1.安装OpenCV库 在命令行中输入以下命令: 2.准备人脸检测器 使用OpenCV的人脸检测器可以检测出图像中

    2024年02月15日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包