Opencv项目实战:23 智能计数和表单信息

news2024/11/25 22:59:31

目录

0、项目介绍

1、效果展示

2、项目搭建

3、项目代码展示与部分讲解

拍照脚本data_collection.py

图片检测Picdetect.py

摄像头检测Videodetect.py

主函数CountMain.py

自定义模块tally.py

4、项目资源

5、项目总结


0、项目介绍

有一段时间没有更新专栏了,本次项目是我的软件课设,自主命题。智能计数指的是对特定物体进行计数(对于比较规整的物体效果很好,例如硬币、钥匙、方块等),表单信息指的是对图片进行计数并写入excel表格当中。从投入到应用角度来看,使用深度学习的方法是更加的准确,而使用opencv的方法有局限性,仍然有改进的空间。

使用步骤:

1、图片检测:

(1)运行data_collection脚本,将对应的物体放在红框当中,轨迹栏可以调整其大小,对框外进行高斯模糊,使用摄像头对圆签进行拍照。(拍照背景最好是纯色,且与物体的颜色有较大的对比)

(2)运行Picdetect.py文件,窗口显示后,如果显示数值与实际值有所不同,可以调整轨迹栏,调整到合适的值后,要记得修改轨迹栏初始化的值。点击键盘s即可保存图片到指定文件夹。

2、摄像头检测:

仅仅只运行Videodetect.py文件,窗口展示后,可以实时调整轨迹栏的滑动条,调整到在这个环境下适合的值,记得修改。点击键盘s即可保存图片,再次按下空格键即可继续检测。

3、控制台交互检测

模式功能可选,包括了Real-time、Mutil-image模式,Real-time模式即为摄像头检测,Mutil-image检测下还有Single-image模式可选,点击Esc键即可返回到是否进行Single-image。

1、效果展示

图片检测

 摄像头检测

 控制台交互检测

表单信息

2、项目搭建

关于这一步其实是很有必要的,因为我曾经看过很多博主直接就将代码贴在文章中,代码文件没有明确的说明在哪个目录下,创建时候还要通过import去琢磨一番。

———— 23 Intelligent Count with form information
  —— photodata
  —— Pic
        -img
        -data.xlsx
  —— Video
        -img
        -data.xlsx
  —— CountMain.py
  —— data_collection.py
  —— main2ship.py
  —— Picdetect.py
  —— tally.py
  —— Videodetect.py

3、项目代码展示与部分讲解

拍照脚本data_collection.py

"""
author : Auorui(夏天是冰红茶)
time : 2023-6-3
function:It is used for data acquisition. Place the round sticks
        in the red box, and perform Gaussian filter processing
        outside the box. Adjust the brightness and size of the
        box adaptively through the track bar. Press the keyboard
        "s" to take photos of the round sticks. The number is unlimited.
"""
import cv2
import tally as ta

Vcap = ta.VideoCap()
Vcap.CapInit(mode=1, w=640, h=480)
count = 1

cv2.namedWindow("photodata")
cv2.createTrackbar("bbox_scale", "photodata", 100, 900, ta.onTrackbarChange)
cv2.createTrackbar("brightness_factor", "photodata", 50, 100, ta.onTrackbarChange)

while True:
    img = Vcap.read()
    img = cv2.flip(img,1)
    bbox_scale = cv2.getTrackbarPos("bbox_scale", "photodata") / 1000.0 + 0.1
    brightness_factor = cv2.getTrackbarPos("brightness_factor", "photodata") / 100.0 + 0.5

    position, img_with_box = ta.Bbox_img(img, bbox_scale=bbox_scale)
    img_with_blur = ta.maskBbox(img, position)

    img_with_blur_and_light = ta.Adjusted_image(img_with_blur, brightness_factor=brightness_factor)

    imgStacked = ta.stackImages(1, [img_with_box,img_with_blur_and_light])
    cv2.imshow("photodata", imgStacked)

    k = cv2.waitKey(1) & 0xFF
    if k == ord('s'):
        filename = "./photodata/image{:03d}.png".format(count)
        cv2.imwrite(filename, img_with_blur_and_light)
        print("image{:03d}.png保存成功!".format(count))
        count += 1
    elif k == 27:
        break

使用注意:

用于数据采集,将物体放在红框中的位置,框外进行了高斯滤波处理,通过轨迹栏自适应的调整亮度和框的大小,按下键盘“s”对圆签进行拍照 ,数量不限。

展示:第一行为调整框的大小,也就是识别的区域,第二行为亮度调整,根据当前的环境适当的调整亮度。原图在左,数据图在右,将目标对准摄像头后就可以按下键“s”,保存右图。

图片检测Picdetect.py

"""
author : Auorui(夏天是冰红茶)
time : 2023-6-18
"""
import cv2
import tally as ta
import os
from datetime import datetime

cv2.namedWindow("Settings")
cv2.resizeWindow("Settings", 640, 240)
cv2.createTrackbar("Threshold1", "Settings", 82, 255, ta.empty)
cv2.createTrackbar("Threshold2", "Settings", 101, 255, ta.empty)

img = cv2.imread("./photodata/image005.png")
success_text = "Successfully saved"
success_text_color = (0, 0, 255)
text_size = 20

save_dir = "./Pic/img"
excel_path = "./Pic/data.xlsx"

image_count = 1
data = []
while True:
    imgPre = ta.preProcessing(img)
    imgStacked,total,imgContours=ta.drawContour(img, imgPre, minArea=15)
    k = cv2.waitKey(1) & 0xFF
    if k == ord('s'):
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        image_name = f"Picimg_{str(image_count).zfill(3)}.png"
        image_path = os.path.join(save_dir, image_name)
        cv2.imwrite(image_path, imgContours)

        data.append([current_time, image_name, total])

        image_count += 1

        cv2.rectangle(imgStacked, (480, 140),
                      (785, 190),
                      (255, 0, 0), -1)
        cv2.putText(imgStacked,
                    success_text,
                    (485, 180),
                    cv2.FONT_HERSHEY_SIMPLEX, text_size / 20, success_text_color, 2)

        cv2.imshow("Settings", imgStacked)
        while True:
            k = cv2.waitKey(1)
            if k == ord(' '):
                break

        ta.excelmation(excel_path,data)
    elif k == 27:
        break

cv2.destroyAllWindows()

摄像头检测Videodetect.py

"""
author : Auorui(夏天是冰红茶)
time : 2023-6-18
"""
import cv2
import tally as ta
import os
from datetime import datetime

Vcap = ta.VideoCap()
Vcap.CapInit(mode=1, w=845, h=480)

cv2.namedWindow("Settings")
cv2.resizeWindow("Settings", 640, 240)
cv2.createTrackbar("Threshold1", "Settings", 82, 255, ta.empty)
cv2.createTrackbar("Threshold2", "Settings", 101, 255, ta.empty)

success_text = "Successfully saved"
success_text_color = (0, 0, 255)
text_size = 20

save_dir = "./Video/img"
excel_path = "./Video/data.xlsx"

image_count = 1
data = []

while True:
    img = Vcap.read()

    imgPre = ta.preProcessing(img)

    imgStacked,total,imgContours=ta.drawContour(img, imgPre, minArea=15)

    k = cv2.waitKey(1) & 0xFF
    if k == ord('s'):
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        image_name = f"Videoimg_{str(image_count).zfill(3)}.png"
        image_path = os.path.join(save_dir, image_name)
        cv2.imwrite(image_path, imgContours)

        data.append([current_time, image_name, total])

        image_count += 1

        cv2.rectangle(imgStacked, (700, 140),
                      (1005, 190),
                      (255, 0, 0), -1)
        cv2.putText(imgStacked,
                    success_text,
                    (705, 180),
                    cv2.FONT_HERSHEY_SIMPLEX, text_size / 20, success_text_color, 2)

        cv2.imshow("Settings", imgStacked)
        while True:
            k = cv2.waitKey(1)
            if k == ord(' '):
                break

        ta.excelmation(excel_path,data)

    elif k == 27:
        break

cv2.destroyAllWindows()

主函数CountMain.py

import cv2
import tally as ta
import os
from datetime import datetime

# 通用
success_text = "Successfully saved"
success_text_color = (0, 0, 255)
text_size = 20
image_count = 1
data = []

####################----------轨迹栏初始化----------#####################
cv2.namedWindow("Settings")
cv2.resizeWindow("Settings", 640, 240)
cv2.createTrackbar("Threshold1", "Settings", 82, 255, ta.empty)
cv2.createTrackbar("Threshold2", "Settings", 101, 255, ta.empty)
########################################################################

##########-----模式检测-----##########
print("Real-time | Multi-image")    #
print("请选择检测识别模式:",end=' ')  #
recongnitionMode = input()          #
#####################################

save_dir, excel_path=ta.ImagePath(recongnitionMode)

if recongnitionMode=='Real-time':
    Vcap = ta.VideoCap()
    Vcap.CapInit(mode=0, w=845, h=480)
    while True:
        img = Vcap.read()
        imgPre = ta.preProcessing(img)
        imgStacked, total, imgContours = ta.drawContour(img, imgPre, minArea=15)

        k = cv2.waitKey(1) & 0xFF
        if k == ord('s'):
            current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            image_name = f"Videoimg_{str(image_count).zfill(3)}.png"
            image_path = os.path.join(save_dir, image_name)
            cv2.imwrite(image_path, imgContours)
            data.append([current_time, image_name, total])
            image_count += 1
            cv2.rectangle(imgStacked, (700, 140),
                          (1005, 190),
                          (255, 0, 0), -1)
            cv2.putText(imgStacked,
                        success_text,
                        (705, 180),
                        cv2.FONT_HERSHEY_SIMPLEX, text_size / 20, success_text_color, 2)
            cv2.imshow("Settings", imgStacked)
            while True:
                k = cv2.waitKey(1)
                if k == ord(' '):
                    break

            ta.excelmation(excel_path, data)
        elif k == 27:
            break

if recongnitionMode == 'Multi-image':
    while True:
        print("是否经过Single-image检测(Y or N)(或按下Esc键退出):", end=' ')
        Single_mode = input()
        if Single_mode.lower() == 'esc':
            break
        if Single_mode == 'Y':
            while True:
                print("请输入要检测图片的路径(或按下Esc键返回):", end=' ')
                path = input().strip()  # ./photodata/image005.png
                if path.lower() == 'esc':
                    break
                if path.lower() == 'exit()':
                    break
                img = cv2.imread(path)
                while True:
                    imgPre = ta.preProcessing(img)
                    imgStacked, total, imgContours = ta.drawContour(img, imgPre, minArea=15)
                    k = cv2.waitKey(1)
                    if k == 27:
                        break
        elif Single_mode == 'N':
            print("请输入图片文件夹路径:", end=' ')
            folder_path = input().strip()
            if folder_path.lower() == 'esc':
                break
            if folder_path.lower() == 'exit()':
                break
            image_files = ta.readPath(folder_path)
            # print(image_files)
            for image in image_files:
                print(image)
                img = cv2.imread(image)
                imgPre = ta.preProcessing(img)
                imgStacked, total, imgContours = ta.drawContour(img, imgPre, minArea=15)
                current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                image_name = f"Picimg_{str(image_count).zfill(3)}.png"
                image_path = os.path.join(save_dir, image_name)
                cv2.imwrite(image_path, imgContours)
                data.append([current_time, image_name, total])
                image_count += 1
                ta.excelmation(excel_path, data)
            print("多文件检测结束!")
            break

        elif Single_mode.lower() == 'exit()':
            break

自定义模块tally.py

这部分代码上传至了Github上,需用自取。

作用:集成了本项目中所有用到的功能函数,建议大家可以学习学习。

4、项目资源

GitHub:23 智能计数和表单信息

5、项目总结

使用钥匙是因为我身旁没有比较好的检测物体,拿的是我旁边的桌子上的备用钥匙,挺多的,代码也是按照了实验室的光照环境和物体本身的条件下修改的,拿去做其他的计数时要修改一部分代码。

这里我也尝试使用了特征匹配的方法,但效果就是强差人意了,而且也不如轨迹栏那么容易调整。

控制台显示数量为12,感兴趣的可以去GitHub里面找到main2sift.py文件,运行看看,这里我就不展示代码了。 

最初采用的轮廓绘点的方法,得到的效果很差。而且正是因为考虑到了外界环境的影响,所有才写了data_collection.py文件,用于减少外界环境的影响,但当Threshold1与Threshold2都调的较小时,就会出现轮廓点,总之误差是比较的大的。

修改方法:这里的修改方法是针对于个人使用在不同的场景下,你需要在tally.py文件中找到findContours函数,角点(approx)和面积(area),都要在打开视频的条件下,将其值打印在控制台中,找到你觉得合适的值在源码上进行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/666749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“专精特新”企业数字化转型,如何激发增长新动能

随着数字技术的不断发展,越来越多的企业开始意识到数字化转型的重要性。对于专精特新的企业来说,数字经济的发展也同样给中小企业带来难得的发展机遇,数字化在助力中小企业降本、增效和提质方面发挥着日益重要的作用,数字化转型已…

英伟达发布GeForce 536.23游戏驱动,一键快速获取

英伟达又赶在6月发布了一款超强游戏驱动,NVIDIA GeForce 536.23 WHQL,并有两款游戏大作宣布,首发日即支持 NVIDIA DLSS 2 和 NVIDIA Reflex,驱动人生带大家一起了解一下这款NVIDIA GeForce 536.23 WHQ驱动,以及获取英伟…

Linux【系统学习】(命令及虚拟机篇-无shell)

目录 第 1 章 Linux 入门 1.1 概述 1.2 Linux 和 Windows 区别 ​编辑 1.3 CentOS 下载地址 第 2 章 VM 与 Linux 的安装 2.1 VMWare 安装 CentOS 安装 第 3 章 Linux 文件与目录结构 3.1 Linux 文件 3.2 Linux 目录结构 第 4 章 VI/VIM 编辑器(重要&…

智能客服机器人:基于知识图谱的多轮对话系统

━━━━ 近年来,随着人工智能的快速发展,人机交互能力不断增强,其中问答技术能够在保证一定准确度的情况下极大地简化用户的搜索操作,在节约时间的同时,还能够加深用户对搜索事物的了解程度,百度公司的小…

一篇文章搞定《Android中View的绘制流程》

一篇文章搞定《CoordinatorLayout完成电商首页》 本文前言怎样到达ViewRootImpl过程如下:流程图小结: 到达ViewRootImpl做了什么第一步:setView()第二步:performTraversals()第三步:DecorView中的Measure()、Layout()、…

nginx配置代理报错

1.背景 因部署需要将项目用nginx进行二次转发访问,配置过程中出现各种报错,现将记录如下 Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as.... 2.nginx配置如下 upstream wuhan1 {#server 19…

【SpringBoot】整合Elasticsearch 操作索引及文档

官网操作文档:Elasticsearch Clients | Elastic 踩坑太多了。。。这里表明一下Spring Boot2.4以上版本可能会出现问题,所以我降到了2.2.1.RELEASE。对于现在2023年6月而言,Es版本已经到了8.8,而SpringBoot版本已经到了3.x版…

Hyper-v 虚拟机挂载物理硬盘的方法-Windows Server 2022/2025

起因: 之前我写过一篇介绍在KVM虚拟机体系下,如何直接挂载物理硬盘和物理分区的方法:KVM虚拟机直接挂栽物理硬盘分区的方法_给libvirt虚机挂载磁盘_lggirls的博客-CSDN博客。近期帮助一个朋友搭建局域网,其中有OA系统要用到window…

【安全】awvs使用(二)

目录 一、设置目标 二、设置登录 三、扫描引擎 四、开启扫描 五、扫描结束 六、报告 前言:怎么使用awvs进行扫描出报告呢? 一、设置目标 二、设置登录 因为扫描的网站需要登录的,这里需要设置这个 三、扫描引擎 四、开启扫描 翻译的页面…

【正点原子STM32连载】第三十六章 SPI实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 第三…

测试实战总结,性能测试-秒杀系统实战与优化,彻底打通性能测试...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 对于大并发量的系…

小程序跳转

小程序的路由跳转 一、路由跳转的方式 1.1 wx.navigateTo wx.navigateTo 保留当前页面,跳转到应用内的某个页面。会将页面缓放在页面栈中,最多十个。 wx.navigateTo({url: test })1.2 wx.redirectTo wx.redirectTo 关闭当前页面,跳转到应…

电商项目,订单如何测试?软件测试实战场景,所有测试点汇总...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 订单测试作为常见…

scanpy单细胞分析流程

梳理一下scanpy单细胞分析流程(处理的是scRNA-seq)。 先上一张流程图: scanpy单细胞分析流程 import scanpy as scRead data 常用的文件格式有两种,分别是h5ad和10X mtx # read h5ad adata sc.read()# read 10X mtx adata …

从小白到大神之路之学习运维第44天---第三阶段----拓展知识-----文件管理命令(find+sed+awk)、pycharm工具

第三阶段基础 时 间:2023年6月20日 参加人:全班人员 内 容: 目录 一、文件管理命令 find 1. 根据文件名查找文件 2. 根据文件类型查找文件 3. 根据文件大小查找文件 4. 根据时间戳查找文件 5. 组合多个条件查找文件 Sed 1. 替…

【Vue】学习笔记-创建Vue3.0工程

创建Vue3.0工程 使用vue-cli创建查看vue/cli版本,确保vue/cli版本在4.5.0以上安装或者升级你的vue/cli创建启动 使用vite创建创建工程进入工程目录安装依赖运行 使用vue-cli创建 官方文档:https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-…

【性能测试】压力测试指标全解之TPS、响应时间

hello,大家好!我是磨磨唧唧小蘑菇~ 接上期阐述了《TP50/90/99/999》的含义及计算方式,本期将阐述压力测试的其他指标,如TPS、响应时间等。 目录 一、TPS 二、响应时间 三、TPS与响应时间RT的关系 一、TPS 1、TPS的含义 …

vscode折叠代码展开快捷键

1.折叠所有代码 (按住ctrl 分别点击k和0) ctrlk,ctrl0 2.展开所有代码 (按住ctrl 分别点击k和j) ctrlk,ctrlj 3. 折叠鼠标竖线所在位置的节点以及当前节点下的子节点(递归折叠) ctrlk,ctrl[ 4. 展开鼠标竖线所在位置的节点以及当前节点下的子节点&#x…

【Springboot】关于Spring和SpringBoot的那些事儿

参考javaguide的学习笔记~ 1 怎么那么多名字呀~ 一开始看到这个图太劝退了,但实际上一开始只需要理解它是一个框架,包含很多个模块,能够简化开发。 使得接收HTTP请求,查数据库,写业务逻辑三部分能够分开。 并且能很…

【2023最全最叼教程】Selenium 自动化测试环境搭建

【导语】Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。本文详细介绍了搭建自动化测试环境所需的工具,让你学习自动化测试不…