在全志H616核桃派上实现USB摄像头的OpenCV颜色检测

news2024/11/15 17:38:32

在给核桃派开发板用OpenCV读取图像并显示到pyqt5的窗口上并加入颜色检测功能,尝试将图像中所有蓝色的东西都用一个框标记出来。

3fa3e94a2f7991df84a9650d37e153cf0a2049d2.png

颜色检测核心api

按照惯例,先要介绍一下opencv中常用的hsv像素格式。颜色还是那个颜色,只是描述颜色用的参数变了。h代表色调,s代表饱和度,v代表明度,比使用rgb格式更方便计算与思考。

e75c63555c89991ebc679bcc64b2d04e0771f8d6.png

opencv中也提供了将rgb bgr等转为hsv图片的api:

hsvImage  = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

cv2.inRange,给定一个要检测的hsv颜色范围,返回一张黑白图。将hsv值在该范围内的像素点全部变为白色,不在的则为黑色。

import numpy as np
hsv_upper=np.array([125, 250, 250])
hsv_lower=np.array([95, 40, 40])
grayImage = cv2.inRange(hsvImage, hsv_lower, hsv_upper) # 颜色二值化

findContours,传入黑白图像,寻找所有轮廓。返回两个列表,contours里是找到的所有轮廓,hierarchy是那些轮廓之间的相对位置关系

contours, hierarchy = cv2.findContours(grayImage, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

minAreaRect,传入一个轮廓,计算最小外接矩形

# 画最小外接矩形
for cts in contours :
    rect = cv2.minAreaRect(cts)

drawContours, 绘制轮廓

box = np.int0(cv2.boxPoints(rect)) 
    cv2.drawContours(rgbImage, [box], 0, (255, 0, 0), 2)

基本测试代码

3fa3e94a2f7991df84a9650d37e153cf0a2049d2 (1).png


import cv2
from  ui_main import Ui_MainWindow
import numpy as np

import PyQt5
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

# 修正qt的plugin路径,因为某些程序(cv2)会将其改到其他路径
import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = os.path.dirname(PyQt5.__file__)


#【可选代码】允许Thonny远程运行
import os
os.environ["DISPLAY"] = ":0.0"

#【建议代码】允许终端通过ctrl+c中断窗口,方便调试
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
timer = QTimer()
timer.start(100)  # You may change this if you wish.
timer.timeout.connect(lambda: None)  # Let the interpreter run each 100 ms

# 线程类
class Work(QThread):
    signal_update_label = pyqtSignal(QPixmap)
    label:QLabel
    def sloat_update_label( self, pixmap:QPixmap):
        self.label.setPixmap(pixmap)

    def run(self):
        print("label.width()=", self.label.width())
        print("label.height()=", self.label.height())
        self.signal_update_label.connect(self.sloat_update_label)
        cap = cv2.VideoCapture(1)
        while True:
            ret, frame = cap.read()
            if ret:

                # 颜色转换
                rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                hsvImage  = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
                
                # 二值化
                hsv_upper=np.array([125, 250, 250])
                hsv_lower=np.array([95, 40, 40])
                grayImage = cv2.inRange(hsvImage, hsv_lower, hsv_upper) # 颜色二值化

                # 查找并绘制最小外接矩形
                contours, hierarchy = cv2.findContours(grayImage, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
                for cts in contours :
                    rect = cv2.minAreaRect(cts)  
                    box = np.int0(cv2.boxPoints(rect)) 
                    cv2.drawContours(rgbImage, [box], 0, (255, 0, 0), 2)

由于摄像头拍出来的噪点很多,而物体由于本身材质反光导致拍出来也有一些部分的颜色变了。所以实际应用时需要对图像进行一些滤波模糊化处理。或是直接对生成后的黑白图像进行一定膨胀与收缩。

0653b67aed75179c07b5bfe12a9c957c02688bfa.png

再把各个参数做成pyqt窗口的选项,查看各项搭配后的效果,快速找到合适的参数选择。

# 图像缩小并转换颜色格式
frame = cv2.resize(frame, (320, 240))
rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = rgbImage.shape

# 图像模糊
if self.blur.flag :
  rgbImage = cv2.blur(rgbImage,(self.blur.num, self.blur.num))
if self.median.flag :
  rgbImage = cv2.medianBlur(rgbImage,self.median.num)
if self.gaussian.flag :
  rgbImage = cv2.GaussianBlur(rgbImage, (self.gaussian.num, self.gaussian.num), 0)

# 二值化
hsvImage = cv2.cvtColor(rgbImage, cv2.COLOR_RGB2HSV)
grayImage = cv2.inRange(hsvImage, np.array([self.hl.num, self.sl.num, self.vl.num]), np.array([self.hu.num, self.su.num, self.vu.num])) # 颜色二值化
                
# 图像操作
if self.dilate.flag :
  grayImage = cv2.dilate(grayImage, np.ones((self.dilate.num, self.dilate.num), dtype=np.uint8), 1) # 膨胀
if self.erode.flag :
  grayImage = cv2.erode(grayImage, np.ones((self.erode.num, self.erode.num), dtype=np.uint8), 1)  # 腐蚀

# 获取中心点的颜色,画上十字光标
height, width = rgbImage.shape[:2]
center_y, center_x = height // 2, width // 2
color = tuple(map(int, rgbImage[center_y, center_x, :]))
cv2.line(rgbImage, (center_x, 0), (center_x, height-1), color, 3)
cv2.line(rgbImage, (0, center_y), (width-1, center_y), color, 3)

contours, hierarchy = cv2.findContours(grayImage, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

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

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

相关文章

图神经网络X项目|基于图神经网络的电商行为的预测(5%)

文章目录 Jupyter Notebook 学习人工智能的好帮手数据集数据集下载数据集调用数据集应用技巧——获取不重复的编号数据集应用技巧——随机采样数据集应用技巧——抽取前N项进行模拟测试 数据集构建技巧一——查看数据集构建进度 Jupyter Notebook 学习人工智能的好帮手 【Jupy…

opencv010 卷积02(方盒滤波和均值滤波)

今天继续学习滤波器的相关知识!这篇比较简单,也短一些,明天写高斯滤波 方盒滤波 boxFilter(scr, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) 方盒滤波的卷积核如下: normalize(标准化&#xff0…

从潮汐架构和安第斯大模型,看智能手机的未来演进

好久没聊手机了,今天聊聊手机。 最近这段时间,手机厂商纷纷发布了自家最新的旗舰系列。其中,有一些技术,蛮值得关注的。 大家都知道,手机行业是出了名的“内卷”,厂商之间的竞争非常激烈。但从本质来说&…

STL之unordered_map使用方法

这里写目录标题 STL之unordered_map使用方法1.什么是STL呢2.unordered_map2.1 头文件:2.2 怎么创建:2.3 初始化:2.4 根据key获取对应value值:2.5 遍历,判断key是否存在:2.6 怎么根据迭代器it获取key和value…

浅谈拨测在网络安全中的应用

在当今数字化时代,网络安全成为各个行业和组织关注的焦点。为了保障网络的稳定性和信息的安全,拨测安全性成为一种日益重要的工具。本文将介绍拨测在网络安全中的应用: 1.威胁模拟 通过威胁模拟,拨测安全性可以模拟各种网络攻击&a…

分布式websocket IM聊天系统相关问题问答【第九期】

前言 上期视频讲解了自己关于聊天系统的设计的时候出现了一些不一样的声音。不了解情况的可以看上上期视频。这期主要是讨论。IM聊天系统设计方案多。我的先说明一下自己的技术背景互相之间才能更好的理解。 本期对应视频 目前已经写的文章有。并且有对应视频版本。 git项目地…

小白初探架构模式—常用的设计模式

目录 1.前言 2. 主从架构 2.1 主从架构的优点 2.2 主从架构的应用场景 2.3 主从架构的实现 2.4 主从架构的示例 3. 主从架构设计的延伸 3.1 主备模式 3.2 主从复制 3.3 集群分片 3.4 异地多活 4. 总结 1.前言 作为一个架构设计小白,我们通常用了很多种工具&…

Java和Redis实现一个简单的热搜功能

1. 前言 我们有一个简单的需求: 搜索栏展示当前登陆的个人用户的搜索历史记录,删除个人历史记录。用户在搜索栏输入某字符,则将该字符记录下来 以zset格式存储的redis中,记录该字符被搜索的个数以及当前的时间戳 (用…

4_机械臂运动学基础向量空间

在了解机械臂正解推导的过程中,几个问题一直困扰着我: 1、为什么3*3矩阵可以描述姿态?矩阵更进一步的意义是什么?姿态是否有其他的描述方式,如果有是什么? 2、机械臂法兰中心相对于基座的坐标,6…

开始学习vue2基础篇(初体验)

一、什么是VUE(官网 :https://cn.vuejs.org/) 官方给出的概念 :Vue (读音 /vju ː/ ,类似于 view) 是一套用 于构建用户界面的前端框架 渐进式的 JavaScript 框架 二、VUE的特点 易用 :基础只需HTML、CSS、…

[小程序]页面事件

一、下拉刷新 1.开启和配置 小程序中开启下拉刷新的方式有两种: ①全局开启下来刷新 在app.json的window节点中,设置enablePullDownRefresh设为ture。 ②局部开启下来刷新 在页面对应的json文件的的window节点中,设置enablePullDownRefresh设…

yolov5 opencv dnn部署 github代码

yolov5 opencv dnn部署 github代码 源码地址实现推理源码中作者的yolov5s.onnx推理条件python部署(因为python比较简单就直接介绍了)c部署 参考链接 源码地址 yolov5官网还提供的dnn、tensorrt推理链接本人使用的opencv c github代码,代码作者非本人,也是上面作者推…

定向减免!函数计算让轻量 ETL 数据加工更简单,更省钱

作者:澈尔、墨飏 业内较为常见的高频短时 ETL 数据加工场景,即频率高时延短,一般均可归类为调用密集型场景。此场景有着高并发、海量调用的特性,往往会产生高额的计算费用,而业内推荐方案一般为攒批处理,业…

【EI会议征稿通知】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024) 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于20…

不建Vivado工程,也能看Device视图

不建Vivado工程,也能看Device视图 在FPGA设计与开发中,Device视图和Package视图发挥着重要的作用。 在Device视图下: 可以查看FPGA芯片可用资源 例如:LUT、FF、BRAM、DSP、URAM等的个数; 可以查看关键资源的分布情…

搭建redis服务器

memcached MongoDB Redis 先把数据存储在内存里,如何定期把内存里数据存储在硬盘,一个Key一个Values redis集群存储数据在内存里面 mysql集群存储数据在硬盘里 netstat -utnlp | grep redis-server 查看端口tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1970/redis-server 1 …

性能优化(CPU优化技术)-NEON指令介绍

「发表于知乎专栏《移动端算法优化》」 本文主要介绍了 NEON 指令相关的知识,首先通过讲解 arm 指令集的分类,NEON寄存器的类型,树立基本概念。然后进一步梳理了 NEON 汇编以及 intrinsics 指令的格式。最后结合指令的分类,使用例…

thinkadmin上传excel导入数据库

<div class="layui-form-item layui-inline"><button class="layui-btn layui-btn-primary">

正则化逻辑回归实战

一、题目 在正则化逻辑回归的练习中&#xff0c;我们将利用正则化的逻辑回归来预测来自制造工厂的微芯片是否通过了质量保证&#xff08;QA&#xff09;。在质量保证期间&#xff0c;每个微芯片都要经过各种测试&#xff0c;以确保其能够正常工作。假设您是该工厂的产品经理&am…

yolov8 opencv dnn部署 github代码

源码地址 本人使用的opencv c github代码,代码作者非本人 实现推理源码中作者的yolov8s.onnx 推理条件 windows 10 Visual Studio 2019 Nvidia GeForce GTX 1070 opencv4.7.0 (opencv4.5.5在别的地方看到不支持yolov8的推理&#xff0c;所以只使用opencv4.7.0) c部署 环境…