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

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

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)
基本测试代码

import cv2
from ui_main import Ui_MainWindow
import numpy as npimport 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:QLabeldef 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)
由于摄像头拍出来的噪点很多,而物体由于本身材质反光导致拍出来也有一些部分的颜色变了。所以实际应用时需要对图像进行一些滤波模糊化处理。或是直接对生成后的黑白图像进行一定膨胀与收缩。

再把各个参数做成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)相关文章:
在全志H616核桃派上实现USB摄像头的OpenCV颜色检测
在给核桃派开发板用OpenCV读取图像并显示到pyqt5的窗口上并加入颜色检测功能,尝试将图像中所有蓝色的东西都用一个框标记出来。 颜色检测核心api 按照惯例,先要介绍一下opencv中常用的hsv像素格式。颜色还是那个颜色,只是描述颜色用的参数变…...
mac安装部署gitbook教程
mac安装部署gitbook教程 前言一、安装准备二、GitBook安装三、项目初始化 前言 一些自己实际操作的记录。 一、安装准备 Node.js gitbook基于Node.js,所以需要提前安装。 下载地址:https://nodejs.org/en/,可以下载比较新的版本。(但我的建议…...
有关软件测试的,任何时间都可以,软件测试主要服务项目:测试用例 报告 计划
有关软件测试的,任何时间都可以,软件测试主要服务项目: 1. 测试用例 2. 测试报告 3. 测试计划 4. 白盒测试 5. 黑盒测试 6. 接口测试 7.自动…...
快乐过寒假,安全不放假
寒假将至,春节即来,为了使孩子们过上一个平安、快乐、文明、祥和、健康、有益的寒假和春节,在共青团永宁县委员会、永宁县望洪镇人民政府的大力支持下,在永宁新华中心村校外少工委的积极配合下,1月20日下午宁夏妇女儿童…...
qt学习:模仿qq界面+添加资源+无边框界面+修改样式
目录 一,创建登录ui界面类 LoginWidget 二,添加图片资源 三,通过样式的方法将图片设置成圆圈的背景 四,新建登录后的ui界面 MWindow 简陋的就可以,因为只为了学习,可以自己补充 五,新建三个嵌套ui界面类,ChatWidget聊天界面 FriendWiidget好友界面 CollectW…...
【Linux】基本指令收尾
文章目录 日期查找打包压缩系统信息Linux和Windows互传文件 日期 这篇是基本指令的收尾了,还有几个基本指令我们需要说一下 首先是Date,它是用来显示时间和日期 直接输入date的话显示是有点不好看的,所以我们可以根据自己的喜欢加上分隔符&…...
精准核酸检测 - 华为OD统一考试
OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。 现在根据传染病流调以及大数据分析&a…...
LINUX文件fd(file descriptor)文件描述符
目录 1.文件接口 1.1open 1.2C语言为什么要对open进行封装 2.fd demo代码 第一个问题 第二个问题 打开文件流程 引言:在学习C语言的时候,我们见过很多的文件的接口,例如fopen,fwrite,fclose等等,但…...
SpringMVC 的理解
MVC MVC(Model-View-Controller)是一种软件设计模式,用于实现用户界面。它将应用程序划分为三个互相交互的部分,以分离内部逻辑表示和表现层。这种分离有助于管理复杂的应用程序,因为它允许开发者单独修改模型、视图或…...
SpringBoot 3.1.7 集成Sentinel
一、背景 我的项目需要引入限流,降级,熔断框架,由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix,Spring Cloud 提供了替代方案,如 Resilience4j,可以使用它来替换 Hystrix。但是网上搜了一下国内Resilie…...
Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索
作者:来自 Elastic Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic Stack 8.12 构建于 Apache Lucene 9.9(有史以来最快的 Lucene 版本)之上,基于我们对标量量化和搜索并发性的贡献,为文本、向量和…...
结构体的内存对齐(计算题常考点)
许久不见我考完试回来啦,让我们接着将结构体进行到底! 目录 结构体对齐的意义: 结构体对齐的实现: 对齐规则: 训练: 好到这里误区来了: 总结: 往期回顾: 下期预告&…...
设置Json对象输出字段顺序
场景 通过情况下对前端输出json格式不需要关注字段顺序,但某些特殊场景需要设置字段输出顺序(例nginx需要对特殊字段顺序进行加密处理);框架有默认的顺序,如 jackson 默认使用字段声明的顺序, fastjson 默认是使用字典序。 jackso…...
当 OpenTelemetry 遇上阿里云 Prometheus
作者:逸陵 背景 在云原生可观测蓬勃发展的当下,想必大家对 OpenTelemetry & Prometheus 并不是太陌生。OpenTelemetry 是 CNCF(Cloud Native Computing Foundation)旗下的开源项目,它的目标是在云原生时代成为应…...
【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)
【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source) 1)执行环境(Execution Environment)1.1.创建执行环境1.2.执行模式(Execution Mode)1.3.触发程序执行…...
【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)
[18/01/2024]:目前为了准备蓝桥杯做一些资料贴,于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档,参考不保证其准确性。 如果在准备蓝桥杯,可与我私信共同学习!!!…...
JavaEE学习笔记 2024-1-18 --模块化Controller层、AJAX与JSON
上一篇 个人整理非商业用途,欢迎探讨与指正!! 文章目录 11.模块化Controller层12.AJAX12.1使用场景 13.JSON13.1如何使用后端发送JSON数据 11.模块化Controller层 将对应模块的Servlet写入到一个指定的模块中,模块化编程 使用switch方式 p…...
rpc跨平台通信的简单案例,java和go
当我们使用Go和Java进行RPC(Remote Procedure Call,远程过程调用)跨平台通信时,你可以使用gRPC作为通信框架。gRPC是一个高性能、开源的RPC框架,它支持多种编程语言,包括Go和Java。下面我将为你提供一个简单…...
Java设计模式之观察者模式详解
Java设计模式之观察者模式详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将一同深入探讨Java设计模式之观察者模式,这是一种代…...
分布式锁实现(mysql,以及redis)以及分布式的概念
道生一,一生二,二生三,三生万物 我旁边的一位老哥跟我说,你知道分布式是是用来干什么的嘛?一句话给我干懵了,我能隐含知道,大概是用来做分压处理的,并增加系统稳定性的。但是具体如…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
