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

在给核桃派开发板用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)

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

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

相关文章

【vscode】远程资源管理器自动登录服务器保姆级教程

远程资源管理器自动登录服务器 介绍如何配置本地生成rsa服务端添加rsa.pub配置config文件 介绍 vscode SSH 保存密码自动登录服务器 对比通过账号密码登录,自动连接能节约更多时间效率,且通过vim修改不容易发现一些换行或者引号导致的错误,v…

CentOS 7安装全解析:适合初学者的指导

目录 前言 一.centos安装 1.下载镜像文件 2.安装 二.远程连接,换源 1.下载并且使用MobaXtermMobaXterm free Xserver and tabbed SSH client for Windows (mobatek.net)https://mobaxterm.mobatek.net/ 远程连接 2.换源 前言 在当今的信息化时代&#xff0c…

使用Go语言编写简单的HTTP服务器

在Go语言中,我们可以使用标准库中的"net/http"包来编写HTTP服务器。下面是一个简单的示例,展示了如何使用Go编写一个基本的HTTP服务器。 go复制代码 package main import ( "fmt" "net/http" ) …

JavaScript DOM表单相关操作之获取表单数据的方式

在与表单相关的操作中&#xff0c;我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据&#xff0c;首先就需要获取到这个输入框对象。 1、通过id属性获取表单数据 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><tit…

【论文阅读笔记】Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation

1.介绍 Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation Swin-Unet&#xff1a;用于医学图像分割的类Unet纯Transformer 2022年发表在 Computer Vision – ECCV 2022 Workshops Paper Code 2.摘要 在过去的几年里&#xff0c;卷积神经网络&#xff…

java程序cpu飙高如何排查

一、使用传统jstack手法来排查 如何使用原生top命令、jstack命令来做定位具体代码的位置处理 1、简单步骤有下面几步 执行top命令&#xff0c;查看CPU占用情况&#xff0c;找到进程的pid(12002)使用 top -Hp <pid> 命令&#xff08;为Java进程的id号&#xff09;查看该…

System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误

目录 背景: 过程: SQL Express的认识: 背景: 正在运行程序的时候&#xff0c;我遇到一个错误提示&#xff0c;错误信息如下&#xff0c;当我将错误信息仔细阅读了一番&#xff0c;信息提示的很明显&#xff0c;错误出现的来源就是连接数据库代码这块string connStr "s…

【教程】iOS Swift应用加固

&#x1f512; 保护您的iOS应用免受恶意攻击&#xff01;在本篇博客中&#xff0c;我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序&#xff0c;并优化其安全性。通过以下步骤&#xff0c;您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …

网络防御保护——1.网络安全概述

一.网络安全概念 通信保密阶段 --- 计算机安全阶段 --- 信息系统安全 --- 网络空间安全 APT攻击 --- 高级持续性威胁 网络安全(网络空间安全--Cyberspace)从其本质上讲就是网络上的信息安全&#xff0c;指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露&#xf…

[pytorch入门] 4. torchvision中数据集的使用

介绍 文档 可以去看官方文档 可以在里面找到一些数据集的使用 CIFAR10 import torchvision from torch.utils.tensorboard import SummaryWriterdataset_transform torchvision.transforms.Compose([torchvision.transforms.ToTensor(), ])train_set torchvision.datas…

opencv#27模板匹配

图像模板匹配原理 例如给定一张图片&#xff0c;如上图大矩阵所示&#xff0c;然后给定一张模板图像&#xff0c;如上图小矩阵。 我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域&#xff0c;…

3DMAX初级小白班第一课:菜单栏介绍

基本介绍 这里不可能一个一个选项全部教给大家&#xff08;毕竟之后靠实操慢慢就记住了&#xff09;&#xff0c;只说一些相对需要注意的设置。 自定义-热键编辑器-热键设置 这里有你所需要的全部快捷键 自定义-自定义UI启动布局 将UI布局还原到启动的位置 自定义-通用单…

成功解决java.nio.charset.MalformedInputException: Input length = 1

项目启动时报错如下 Connected to the target VM, address: 127.0.0.1:5309, transport: socket 18:01:22.607 [main] ERROR o.s.b.SpringApplication - [reportFailure,843] - Application run failed org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedIn…

竞赛保研 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

pod 报错Failed to connect to github.com port 443

pod 报错Failed to connect to github.com port 443 1、排查代理问题1.1、查找网络代理1.2、修改 Git 的代理 2、排查DNS解析问题2.1、查找 ip地址2.2、修改 host 文件 1、排查代理问题 1.1、查找网络代理 打开 设置 --> 网络与Internet --> 查找代理 1.2、修改 Git …

《堆排序》与《Top—k》

目录 ​编辑 前言&#xff1a; 关于《堆排序》&#xff1a; 第一步&#xff1a;建堆 第二步&#xff1a;排序 《Top—K问题》 关于Top—k问题&#xff1a; 前言&#xff1a; 我们在前面的blog中&#xff0c;对于《堆》已经有了初步的概念&#xff0c;那么接下来我们可以…

探索设计模式的魅力:一次设计,多次利用,深入理解原型模式的设计艺术

原型模式是一种设计模式&#xff0c;属于创建型模式的一种&#xff0c;它用于创建重复的对象&#xff0c;同时又能保持性能。在原型模式中&#xff0c;通过复制现有对象的原型来创建新对象&#xff0c;而不是通过实例化类来创建对象。这样做可以避免耗费过多的资源开销&#xf…

第二节 K8S 的架构

第二节 K8S 的架构 K8S 架构图如下: 官方文档: https://kubernetes.io/docs/concepts/architecture/ kube-api-server 是集群的核心&#xff0c; 是k8s中最重要的组件&#xff0c; 因为它是实现声明式api的关键, 整个集群的入口,所有请求都要经过它, api接口服务. kubernetes…

Navicat使用HTTP通道连接远程服务器的SQLite文件

拷贝ntunnel_sqlite.php文件到Linux机器中 ntunnel_sqlite.php文件位置&#xff1a; 在Navicat安装位置中可以找到ntunnel_sqlite.php文件&#xff0c;其他两个类似文件是支持MySQL和pgsql的

【开源】基于JAVA+Vue+SpringBoot的高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…