当前位置: 首页 > news >正文

汽车零件分装报警系统(2)

接上文,

ocr = PaddleOCR(use_angle_cls=True,use_gpu=True, lang='en') ocr2 = PaddleOCR(use_angle_cls=False, use_gpu=True, lang='en')

初始化两个PaddleOCR识别器对象,用于文字识别。

第一个识别器是启用文字方向分类器(其实就是自动检测并纠正一些倾斜旋转的文字,适合识别角度不确定的图片,但是识别速度就会下降),并且使用GPU加速,识别的是英文

第二个没有启用方向分类器进行识别。

首次识别进行角度矫正,所以第二次识别的时候图片角度已经正确。双重识别结果更可靠。

接下来介绍的函数都是定义在类class PyQtMainEntry(QMainWindow, Ui_MainWindow)中的

一、初始化

这个初始化方法设置了3个摄像头的识别系统,对应到之前提到的3组OCR识别函数

def __init__(self): super().__init__() self.setupUi(self)

继承父类初始化,然后加载UI界面(这里使用的是pyqt中designer生成的界面)

self.ser1 = serial.Serial(opt.SERIAL_PORT1, 9600, timeout=2.5) self.ser2 = serial.Serial(opt.SERIAL_PORT2, 9600, timeout=2.5) # self.ser3 = serial.Serial(opt.SERIAL_PORT3, 9600, timeout=2.5)

串口连接,其实就是报警器控制。连接了两个报警器

self.label_4.setVisible(False) self.label_5.setVisible(False) self.label_6.setVisible(False)

UI标签初始化,隐藏了3个警告标签,对应了3个摄像头,识别到违规零件才显示。

self.list_zong1 = []# 存储OCR识别结果列表 self.list_zong2 = [] self.list_zong3 = [] self.set_zong1 = set()# 存储标准化后的结果集合 self.set_zong2 = set() self.set_zong3 = set() self.set_12hun = set()# 可能是存储合格/白名单 self.guo = []# 存储过程/中间结果 self.list1 = []# 临时列表1 self.list2 = [] self.list3 = [] self.daan1 = ''# 答案/结果1 self.daan2 = '' # self.showMaximized()

数据存储结构,有三组,每组都有独立的存储空间,对应三个摄像头。list_zong是原始识别结果。set-zong是标准化后的结果。

# 第一个摄像头 self.camera1 = HKCamera(CameraIp='192.168.20.30') self.camera1.set_Value(param_type="enum_value", node_name="PixelFormat", node_value='BayerGB8') self.camera1.set_Value(param_type="enum_value", node_name="GainAuto", node_value='Continuous') self.camera1.set_Value(param_type="float_value", node_name="AcquisitionFrameRate", node_value='15.0000') # self.camera1.set_Value(param_type="enum_value", node_name="ExposureAuto", # node_value='Continuous') # 自动曝光 self.camera1.start_camera() # 第二个摄像头 self.camera2 = HKCamera(CameraIp='192.168.20.20') self.camera2.set_Value(param_type="enum_value", node_name="PixelFormat", node_value='BayerGB8') self.camera2.set_Value(param_type="enum_value", node_name="GainAuto", node_value='Continuous') self.camera2.set_Value(param_type="float_value", node_name="AcquisitionFrameRate", node_value='15.0000') # self.camera2.set_Value(param_type="enum_value", node_name="ExposureAuto", # node_value='Continuous') #自动曝光 # self.camera2.set_Value(param_type="enum_value", node_name="DecimationHorizontal", # node_value='2') # self.camera2.set_Value(param_type="enum_value", node_name="DecimationVertical", # node_value='2') self.camera2.start_camera()

摄像头初始化,这里是两个海康工业相机,这两个配置几乎是一样的。ip地址在同一网段下,像素格式(BayerGB8),增益(自动连续),帧率(15帧每秒)都是一样的,

#第三个摄像头 self.camera3 = cv2.VideoCapture(opt.cap_numb3) # 启动后台线程来定期释放第三个摄像头的资源 release_thread2 = threading.Thread(target=release_capture3, args=(self.camera3,)) release_thread2.daemon = True # 设置为守护线程,随主线程结束而结束 release_thread2.start() #定时器设置 self.is_camera_opened = False self._timer = QtCore.QTimer(self) self._timer.timeout.connect(self._queryFrame) self._timer.setInterval(opt.frame_delay) self.frame_counter = 0 # 统计画面的帧数

摄像头三就是普通的USB摄像头,使用opencv的videoCapture。

然后就是摄像头3的资源维护线程。启动守护线程,每三十分钟重启一次USB摄像头。

定时器设置,Qt定时器,定时获取摄像头画面,67ms间隔,相当于15帧/秒。预工业相机的帧率匹配。

这是一个三路并行识别系统,每个摄像头独立识别零件编码,发现违规时通过串口控制报警器报警。

二、控制视频识别开关的按钮回调

正割函数控制整个识别系统的启动和停止,类似于开始监控/停止监控按钮。

def openvideo(self): # 1. 切换摄像头状态(开/关) self.is_camera_opened = not self.is_camera_opened if self.is_camera_opened: # 2. 开启识别模式 self.pushButton_4.setText("关闭")# 按钮文字改为"关闭" self._timer.start()# 启动定时器,开始识别 else: # 3. 关闭识别模式 self.pushButton_4.setText("打开")# 按钮文字改为"打开" self._timer.stop()# 停止定时器 # 4. 关闭所有报警器 sendCmdToDevice(BUZZ_CMD_CLOSE, self.ser1)# 关闭报警器1 sendCmdToDevice(BUZZ_CMD_CLOSE, self.ser2)# 关闭报警器2 # sendCmdToDevice(BUZZ_CMD_CLOSE, self.ser3) # 5. 隐藏所有警告标签 self.label_4.setVisible(False)# 隐藏摄像头1的警告 self.label_5.setVisible(False) self.label_6.setVisible(False)

开始识别时,状态切换为True,按钮文字变为关闭,启动定时器开始不断调用_queryFrame获取图像并识别。

关闭识别时,状态切换为False,按钮文字变为打开,停止定时器就停止了识别,发送关闭命令,停止所有将抱起的声音和闪光,隐藏所有警告标签,中指界面状态。

这个函数和介绍类之前的函数的关联,_timer定时器控制识别频率,sendCmdToDevice函数控制报警器,label_4/5/6用来显示3个摄像头的警告,self.is_camera_opened全局状态标志。

其实这个函数就是界面设计的函数对吧,里面用到的函数就是我们对按钮自定义的函数。

三、打开文件夹-复位按钮一-复位按钮二-装饰器

def open_folder(self): folder_path = r'D:\MVS\MVS\Development\Samples\Python\shiyan\baojing' QDesktopServices.openUrl(QUrl.fromLocalFile(folder_path)) def clearSet1(self): # 复位按钮一 self.set_zong1.clear() # self.list_zong1.clear() self.list1.clear() sendCmdToDevice(BUZZ_CMD_CLOSE, self.ser1) self.label_4.setVisible(False) def clearSet2(self): # 复位按钮二 self.set_zong2.clear() # self.list_zong2.clear() self.list2.clear() sendCmdToDevice(BUZZ_CMD_CLOSE, self.ser2) self.label_5.setVisible(False) def execute_after_n_calls(n, w2set): def decorator(func): def wrapper(self, *args, **kwargs): wrapper.count += 1 result = func(self, *args, **kwargs) if wrapper.count % n == 0: w2set(self) return result wrapper.count = 0 return wrapper return decorator

函数一:在文件管理器中打开指定的文件夹

函数二:重置摄像头1的识别状态,清除已识别的数据,并停止报警,隐藏警告图标。

函数三:和函数二一样只不过这里对应的是摄像头2

函数四:装饰器工厂,用于限制函数执行频率,两个参数,n是调用多少次后才触发,w2set是达到次数后执行的回调函数,每调用一次被装饰的函数,计数器就会+1,当计数是n的倍数时,执行w2set。这个装饰器的目的是,提高准确率(累计多次识别结果,取众数后再显示)、减少界面刷新(不是每次识别都更新,降低CPU/GPU负载)、平滑显示(避免识别结果频繁闪烁变化)、投票机制(就像之前讲一个零件识别多次,取可靠的)。

这是一个稳定的工业识别系统的设计模式,兼顾实时性和准确性。

http://www.jsqmd.com/news/534800/

相关文章:

  • SVG 写的 DICOM C-MOVE 过程展示
  • DeepSeek-OCR-2零售行业应用:商品标签识别系统实现
  • 智能车越野组硬件设计实战:基于逐飞TC264的主板与无刷驱动板DIY全记录
  • 告别Xcode项目配置冲突:XcodeGen如何重构iOS团队协作开发范式
  • Windows Server 2008 R2提权实战:用MS15-051漏洞从WebShell到System权限的完整操作记录
  • WinRAR(老牌压缩软件) v7.20 / 7.21 Beta1 x64 烈火汉化版
  • AI视觉文本技术终极指南:如何让AI看懂图片中的文字
  • Git Updater安全配置:如何保护你的访问令牌和API密钥
  • 毕业论文降AI率保姆级攻略:3步降到15%以下顺利通过检测 - 我要发一区
  • 5个维度打造你的专属音乐中心:开源音乐播放器MusicFree全解析
  • Qwen3-ASR在在线教育平台的应用:课件语音搜索系统
  • 智能客服场景落地:集成万象熔炉·丹青幻境的对话式AI助手开发
  • Halcon实战:用shape_trans算子5分钟搞定不规则区域的最小外接矩形提取
  • cleartext-mac应用场景指南:在工作和生活中如何发挥最大价值
  • 内科/外科主治备考速通:两位科室专属铭师,让提分不走弯路 - 医考机构品牌测评专家
  • MINDS-i-Common:教育机器人中的速率可控舵机框架
  • BIThesis解决书脊排版问题的动态布局优化方案
  • 如何构建可重用组件:Openblocks模块与查询库终极指南
  • FLUX.1-devAI应用实践:结合RAG构建设计师智能提示词助手
  • 如何提升漫画下载效率?PicAComic Downloader的全方位解决方案
  • 5个Kubernetes网络策略常见误区:从Network Policy Recipes中学习正确配置
  • 阿虎白卷深度测评:精准押考点+高效提分,晋高冲刺优选 - 医考机构品牌测评专家
  • 从“Root大师”到Magisk:一个安卓小白的踩坑实录与工具进化史
  • 测试0031
  • Nanobot知识图谱:Neo4j数据库集成指南
  • Tailwind+AI前端开发指南:用ChatGPT快速生成响应式登录页(附完整prompt模板)
  • 【南京理工大学、中国人工智能学会智能检测与运动控制技术专业委员会联合主办 |ACM(有ISBN号)出版,EI、Scopus检索】2026年智能检测与运动控制技术国际会议(IDMCT 2026)
  • UnrealCLR异常处理与调试:为什么这是.NET开发者必须掌握的技能
  • 告别字体混乱:TexStudio+Mactex2022中文字体配置全攻略(Mac版)
  • 副主任医师备考亲测:最贴近实战的试卷,我只推荐这三款 - 医考机构品牌测评专家