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

news/2024/5/19 11:45:56/文章来源:https://blog.csdn.net/m0_62919535/article/details/131013726

目录

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 sticksin the red box, and perform Gaussian filter processingoutside the box. Adjust the brightness and size of thebox 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 taVcap = ta.VideoCap()
Vcap.CapInit(mode=1, w=640, h=480)
count = 1cv2.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.1brightness_factor = cv2.getTrackbarPos("brightness_factor", "photodata") / 100.0 + 0.5position, 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) & 0xFFif 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 += 1elif k == 27:break

使用注意:

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

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

图片检测Picdetect.py

"""
author : Auorui(夏天是冰红茶)
time : 2023-6-18
"""
import cv2
import tally as ta
import os
from datetime import datetimecv2.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 = 20save_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) & 0xFFif 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 += 1cv2.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(' '):breakta.excelmation(excel_path,data)elif k == 27:breakcv2.destroyAllWindows()

摄像头检测Videodetect.py

"""
author : Auorui(夏天是冰红茶)
time : 2023-6-18
"""
import cv2
import tally as ta
import os
from datetime import datetimeVcap = 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 = 20save_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) & 0xFFif 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 += 1cv2.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(' '):breakta.excelmation(excel_path,data)elif k == 27:breakcv2.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) & 0xFFif 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 += 1cv2.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(' '):breakta.excelmation(excel_path, data)elif k == 27:breakif recongnitionMode == 'Multi-image':while True:print("是否经过Single-image检测(Y or N)(或按下Esc键退出):", end=' ')Single_mode = input()if Single_mode.lower() == 'esc':breakif Single_mode == 'Y':while True:print("请输入要检测图片的路径(或按下Esc键返回):", end=' ')path = input().strip()  # ./photodata/image005.pngif path.lower() == 'esc':breakif path.lower() == 'exit()':breakimg = 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:breakelif Single_mode == 'N':print("请输入图片文件夹路径:", end=' ')folder_path = input().strip()if folder_path.lower() == 'esc':breakif folder_path.lower() == 'exit()':breakimage_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 += 1ta.excelmation(excel_path, data)print("多文件检测结束!")breakelif 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.luyixian.cn/news_show_319297.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试入门篇

软件测试含义 在规定条件下对程序进行操作,发现软件错误,衡量软件质量,对其是否能满足设计要求进行评估的过程 开发不做测试原因:测试力度,思维方式,关注度 计算机定义 一种可以自动高效进行技术操作的…

vue引入jszip下载多个图片并压缩下载

vue引入jszip下载多个图片并压缩下载 jszip官网地址 先进行jszip下载 npm install jszip然后废话不多说直接上代码 <template><div><button click"downloadImages">下载图片</button></div> </template><script> impo…

Prompt的技巧持续总结

Prompt 有很多网站已经收录了&#xff0c;比如&#xff1a;aimappro 有些直接抄上述网站的作业即可&#xff0c;不过也来看看&#xff0c; 有一些日常提问大概的咒语该怎么写。 1 三种微调下的提示写法 chatgpt时代的创新&#xff1a;LLM的应用模式比较 实际案例说明AI时代大…

《Stable Diffusion WebUI折腾实录》在Windows完成安装, 从社区下载热门模型,批量生成小姐姐图片

环境 操作系统: Windows11 显卡: RTX2060 6GB 显存 安装Python 下载 Python3.10.6 https://www.python.org/ftp/python/3.10.6/python-3.10.6-amd64.exe安装 注意勾选 Add Python 3.10.6 to PATH &#xff0c;然后一路下一步即可 打开powershell&#xff0c; 确认安装成功 …

#10035. 「一本通 2.1 练习 1」Power Strings

Power Strings 题意简述&#xff1a; 求一个字符串由多少个重复的子串连接而成。 例如 ababab 由三个 ab 连接而成&#xff0c;abcd 由 abcd 由一个 abcd 连接而成。 输入格式 本题多组数据。 每一组数据仅有一行&#xff0c;这一行仅有一个字符串 s s s。 输入的结束标…

IT云运维技术分享

1 运维体系 1.1 市场对运维的需求 时代发展到今天&#xff0c;社会的生活方式与生产方式的全面的数字化&#xff0c;无论是传统企业还是互联网企业&#xff0c;都在全面上云&#xff0c;这也意味着企业的关键业务乃至“身家性命”都已经全部放在 IT 系统之上&#xff0c;因此…

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容

VMware Integrated OpenStack 7.3 - 支持 vSphere 8.0U1 和 NSX 4.1 并向下兼容 VMware 支持的 OpenStack 发行版&#xff1a;在 VMware 虚拟化技术之上运行企业级 OpenStack 云 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vio-7/&#xff0c;查看最新版。原创…

android 如何分析应用的内存(八)——Android 7.0以后的malloc debug

android 如何分析应用的内存&#xff08;八&#xff09; 接上文&#xff0c;介绍六大板块中的第三个————malloc调试和libc回调 上一篇文章中&#xff0c;仅仅是在分配和释放的时候&#xff0c;拦截对应的操作。而不能进一步的去检查内存问题。比如&#xff1a;释放之后再…

智能单相电能表

智能单相电能表是一种基于嵌入式系统和电子技术的智能化电能表&#xff0c;具有多种功能和特点&#xff0c;下面是关于智能单相电能表的介绍。 一、工作原理 智能单相电能表采用电子技术和嵌入式系统实现电能测量的智能化和自动化。它包括电压采样装置、电流采样装置、电能计算…

B/S版医院检验科lis系统源码 云lis系统

LIS系统为实验室服务对象提供检验申请、采集标本、结果查询等功能&#xff1b;为实验室工作人员的核收标本、分送标本、传送资料、分析前处理、质量控制、单向或双向通讯、分析后处理、结果审核、打印报告、结果查询等标本检测过程提供全面的技术支持。 .Net Core LIS系统源码…

Git 多账号多仓库配置 SSH

前言 在我们使用 Git 中&#xff0c;有时候会遇到多账号多仓库的情况&#xff0c;比如公司的 GitLab 和 GitHub&#xff0c;以及自己的 GitHub&#xff0c;这时候我们就需要配置多个 SSH 密钥来区分不同的账号和仓库 生成 SSH 密钥 根据你注册仓库的邮箱生成 SSH 密钥&#…

centos下的Nginx的安装

1.Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占有内存少&#xff0c;并发能力强。 其他服务器介绍&#xff1a;Apache服务器、Tomcat服务器、Lighttpd服务器 2.nginx依赖安装 yum -y instal…

PSINS工具箱学习(一)下载安装初始化、SINS-GPS组合导航仿真、习惯约定与常用变量符号、数据导入转换、绘图显示

文章目录 一、前言二、相关资源三、下载安装初始化1、下载PSINSyymmdd.rar工具箱文件2、解压文件3、初始化4、启动工具箱导览 四、习惯约定与常用变量符号1、PSINS全局变量结构体 glv2、坐标系定义3、姿态阵/姿态四元数/欧拉角 Cnb/qnb/att4、IMU采样数据 imu5、AVP导航参数 av…

【MySQL 日志管理、备份与恢复】

目录 一、数据库备份的分类1、从物理与逻辑的角度1.1、物理备份: 对数据库操作系统的物理文件&#xff08;如数据文件&#xff0c;日志文件等&#xff09;的备份1.2、逻辑备份 2、从数据库的备份策略角度3、常见的备份方法3.1、物理冷备3.2、专用备份工具mysqldump 或者 mysqlh…

使用Channel的一些业务场景

使用Channel的一些业务场景 首先需要明确的就是&#xff0c;发送方才知道什么时候关闭 channel &#xff0c;这个是比较符合逻辑的。 我们需要知道哪些情况会使 channel 发生 panic 关闭一个 nil 值会引发关闭一个已经关闭的 channel 会引发向一个已经关闭的 channel 发送数据…

破圈丨2023年绿色积分消费返利:云联惠3.0升级版【循环购】商业模式

破圈丨2023年绿色积分消费返利&#xff1a;云联惠3.0升级版【循环购】商业模式 京东供应链商品/自营商品/供应商商品 平台上面产品超过300w款产品&#xff0c;均为京东供应链货品&#xff0c;由京东统一仓储和配送&#xff0c;从源头上面杜绝假冒伪劣产品的存在&#xff0c;然…

three.js中通过gsap动画库实现物体的动画

一、什么是gsap GSAP&#xff08;GreenSock Animation Platform&#xff09;是一个JavaScript动画库&#xff0c;由GreenSock公司开发&#xff0c;用于在Web应用程序中创建高性能动画。 使用GSAP可以通过一些简单的动画操作来实现复杂的动画效果&#xff0c;例如TweenLite、T…

【百套源码】HTML5期末大作业 - 各类网页作业源码合集

文章目录 持续更新文章记录1️⃣ 个人介绍类相关源码1.1 html实现个人简历1.2 科技风个人简历1.3 网站风个人简历1.4 多种风格个人主页模板1.5 html好看的个人简历明星版1.6 专属个人主页-系列11.7 专属个人主页-系列21.8 专属个人主页-系列31.9 专属个人主页-系列41.10 专属个…

【Red Hat7.9安装Oracle11g--调用图形化界面的几种方式】

【Red Hat7.9安装Oracle11g--调用图形化界面的几种方式】 &#x1f53b; 一、续上一篇[【Red Hat 7.9---详细安装Oracle 11g---图形化界面方式】](https://blog.csdn.net/qq_41840843/article/details/131198718?spm1001.2014.3001.5501)⛳ 1.1 前言⛳ 1.2 方式一、使用Xmanag…

AI绘图软件分享:Midjourney 基础教程(二)

大家好&#xff0c;我是权知星球&#xff0c;今天继续给大家介绍AI绘图软件分享&#xff1a;Midjourney 基础教程&#xff08;二&#xff09; ⼀、Midjourney 服务器介绍 1.Discord 软件介绍 Midjourney AI 绘画服务基于 Discord 软件的&#xff0c;它的绘画功能&#xff0c;…