0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

全志在线 来源:walnutpi 2024-01-20 17:50 次阅读

在前几周的文章中已经介绍过如何在核桃派上用OpenCV读取图像并显示到pyqt5的窗口上,这里在上一篇文章的基础上,给开发板加入颜色检测功能,尝试将图像中所有蓝色的东西都用一个框标记出来。

颜色检测核心api

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

29ce6f4c-b768-11ee-8b88-92fbcf53809c.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)

基本测试代码

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
    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)

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

29f0acec-b768-11ee-8b88-92fbcf53809c.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)

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    60

    文章

    7888

    浏览量

    263929
  • 摄像头
    +关注

    关注

    59

    文章

    4806

    浏览量

    95389
  • OpenCV
    +关注

    关注

    29

    文章

    626

    浏览量

    41247

原文标题:在核桃派上实现USB摄像头的OpenCV颜色检测

文章出处:【微信号:gh_79acfa3aa3e3,微信公众号:全志在线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    树莓派上使用OpenCV和Python实现实时人脸检测

    理论知识,因此初学者也能轻松跟着步骤实现。 项目所需设备 硬件: 树莓派 3 Model B; 树莓派摄像头模块(PiCam)。 语言和库: OpenCV Python 3 步骤 本文主要讲述如何使用 PiCam
    的头像 发表于 03-06 09:00 5.1w次阅读

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

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

    使用esp-iot-solution master分支的usb_stream摄像头颜色不对是怎么回事?

    使用esp-iot-solution master分支的usb_stream 连接usb摄像头颜色偏红。这个摄像头
    发表于 06-27 06:41

    OpenWRT + OpenCV 无线摄像头监控和图像处理

    诞生了。【步骤:路由】路由器上的原材料:703n固件mjpeg-streamer软件免驱摄像头(笔者使用的是某宝上淘来的东芝笔记本拆机摄像头)首先要实现图像传输需要在路由上挂载USB
    发表于 02-09 22:15

    【OK210试用体验】之(五)——Ubuntu12.04安装OpenCV2.4.9并实现USB摄像头C270图像采集

    迈进。今天帖子的主要内容就是Ubuntu12.04上安装图像处理软件OpenCV,并用简单的程序实现UVC摄像头C270的图像采集。 硬件平台:Windows7 64 bit +
    发表于 08-02 12:21

    NanoPi 2接USB摄像头使用OpenCV

    `NanoPi 2接USB摄像头使用OpenCVOpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。NanoPi 2跑Debian
    发表于 12-24 18:34

    Nanopi M3 u***摄像头使用opencv

    首先先准备好器材1.M3板子2.烧写好debian系统的sd卡3.lcd屏 (我用的是x710的电容屏,7寸的)4.USB(FA-CAM202)200万摄像头模块启动系统后:OpenCV的全称
    发表于 10-11 15:42

    【大联大友尚安森美半导体感光芯片USB双目摄像头模组试用体验】开箱报告

    ` 经过申请,收到了双目摄像头,这次主要是通过双目摄像头搭载linux操作系统,基于Qt+Opencv库进行图形算法的识别。本次很荣幸可以参加这次的试用体验活动。好了,下面就开始对USB
    发表于 09-02 09:52

    【大联大友尚安森美半导体感光芯片USB双目摄像头模组试用体验】使用opencv打开摄像头

    因为我们使用的是Qt+opencv 进行摄像头项目环境的搭建去对双目摄像头进行测试。目前我用的是Qt5, opencv 使用的是oepcv3.4
    发表于 09-26 21:54

    【大联大友尚安森美半导体感光芯片USB双目摄像头模组测试三】--宠物机器人摄像头人脸采集和识别

    镜头,2是右侧镜头,之后会优化本项目代码,将两个摄像头共同调用协同处理采集的画面,这里主要以实现调用和人脸检测为目的。暂不累述。2人脸识别及背光调节这里主要是面对项目宠物小车多光源环
    发表于 10-20 00:16

    STM32单片机如何实现连接USB摄像头

    STM32单片机实现连接USB摄像头如题,本人已经实现STM32连接基于Cypress CY7C68013A的摄像头电路板的方案,具体
    发表于 07-19 06:20

    如何去实现一种基于opencv与flask的摄像头图像传输呢

    硬件:eaidk610(fedaro28)、普通带usb接口摄像头软件环境: python3.9、opencv4.6、Flask2.2主要实现了从板子的连接的
    发表于 10-18 14:25

    STM32单片机实现连接USB摄像头

    STM32单片机实现连接USB摄像头如题,本人已经实现STM32连接基于Cypress CY7C68013A的摄像头电路板的方案,具体
    发表于 11-18 20:51 146次下载
    STM32单片机<b class='flag-5'>实现</b>连接<b class='flag-5'>USB</b><b class='flag-5'>摄像头</b>

    Linux下QT+OpenCV实现人脸实时检测(摄像头)

    程序功能: 子线程里打开摄像头,获取摄像头的数据,通过信号与槽的方式,将摄像头数据传递给主UI界面实时显示,采用定时器每100ms取一次
    的头像 发表于 08-14 09:29 2013次阅读
    Linux下QT+<b class='flag-5'>OpenCV</b><b class='flag-5'>实现</b>人脸实时<b class='flag-5'>检测</b>(<b class='flag-5'>摄像头</b>)

    USB摄像头解决方案

    摄像头大家应该都不陌生,但USB摄像头大家见过么? 近期USB摄像头火了起来,与手机连接后可以
    的头像 发表于 08-28 23:06 1863次阅读
    <b class='flag-5'>USB</b><b class='flag-5'>摄像头</b>解决方案