opencv02

本文介绍了如何使用OpenCV进行图像的颜色空间转换,重点在BGR到HSV的转换,以及如何利用HSV空间进行物体跟踪。通过设置HSV阈值,可以提取特定颜色的物体,例如蓝色。此外,还展示了程序性能的简单评估方法。示例代码展示了从摄像头捕获视频,检测蓝色物体并用矩形框出的实现过程。
摘要由CSDN通过智能技术生成

图像的基础操作,色彩空间

笔记

之前学过一点写在下面了:
图像数字化
就写一下补充:
在这里插入图片描述

色彩空间

Opencv中常用的颜色空间就三种BGR、HSV、灰度。

颜色空间转换

​ 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。

​ 我们要用到的函数是:cv.cvtColor(input_image,flag),其中 flag 就是转换类型。

​ 对于 BGR↔Gray 的转换,我们要使用的 flag 就是cv.COLOR_BGR2GRAY。 同样对于 BGR↔HSV 的转换,我们用的 flag 就是 cv.COLOR_BGR2HSV。 你还可以通过下面的命令得到所有可用的 flag。(前面是转化前后面是转化后中间2)
Note:在 OpenCV 的 HSV 格式中,H(色彩/色度)的取值范围是 [0,179], S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。但是不 同的软件使用的值可能不同。所以当你需要拿 OpenCV 的 HSV 值与其他软 件的 HSV 值进行对比时,一定要记得归一化(按比例统一)。

物体跟踪

​ 现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了,我们可以利用这 一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间 中更容易表示一个特定颜色。在我们的程序中,我们要提取的是一个蓝色的物 体。下面就是就是我们要做的几步:

从视频中获取每一帧图像
将图像转换到 HSV 空间
设置 HSV 阈值到蓝色范围。
获取蓝色物体,当然我们还可以做其他任何我们想做的事,比如:在蓝色 物体周围画一个圈。
代码如下:

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
    # Take each frame
    _, frame = cap.read()
    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # Threshold the HSV image to get only blue colors
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    # Bitwise-AND mask and original image
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

在这里插入图片描述

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
print( hsv_green )
[[[ 60 255 255]]]

​ 通过计算程序执行时间判断程序性能:

​ cv.getTickCount 函数返回从参考点到这个函数被执行的时钟数。所 以当你在一个函数执行前后都调用它的话,你就会得到这个函数的执行时间 (时钟数)。cv.getTickFrequency返回时钟频率,或者说每秒钟的时钟数。所以 你可以按照下面的方式得到一个函数运行了多少秒:

e1 = cv.getTickCount()
# your code execution
e2 = cv.getTickCount()
time = (e2 - e1)/ cv.getTickFrequency()

感觉没什么用

思考题

HSV和BGR三原色在图片信息存储的差别在哪?
呃BGR是把三种原色分开来,数值代表亮度,然后叠加,HSV将颜色,饱和度(不了解),亮度剥离出来,可能对于某些操作更方便。

练习题

1.编写一段程序实现以下功能:
代码调用电脑摄像头,寻找视野中任意颜色(自定)并具有一定大小的物体,并用矩形框处,最后显示在图像上;

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(r'C:\Users\19583\Desktop\3.mp4')
while(1):
    # Take each frame
    _, frame = cap.read()
    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # define range of blue color in HSV
    lower_blue = np.array([42,43,46])
    upper_blue = np.array([77,255,255])
    # Threshold the HSV image to get only blue colors
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    # Bitwise-AND mask and original image
    res = cv.bitwise_and(frame,frame, mask= mask)
    res=cv.resize(res,(500,500))
    gj1=res[:,:,0].copy()#分离出色彩通道
# 腐蚀除去那些零散的绿点
    ke=np.ones((5,5),dtype=int)
    res=cv.erode(res,ke,iterations=3)
    gj1 = cv.erode(gj1, ke, iterations=3)
    d1x=0
    d1y=0
    d2x=0
    d2y=0
    for i in range(gj1.shape[0]):#遍历图像找到临界的两个点的坐标,并用他们画矩形
        flag=0
        for j in range(gj1.shape[1]):
            if gj1[i][j]>0:
                flag=1
        if flag==1:
            d1y=i
            break
    for i in range(gj1.shape[0]-1,0,-1):
        flag=0
        for j in range(gj1.shape[1]):
            if gj1[i][j]>0:
                flag=1
        if flag==1:
            d2y=i
            break
    for i in range(gj1.shape[1]):
        flag=0
        for j in range(gj1.shape[0]):
            if gj1[j][i]>0:
                flag=1
        if flag==1:
            d1x=i
            break
    for i in range(gj1.shape[0]-1,0,-1):
        flag=0
        for j in range(gj1.shape[1]):
            if gj1[j][i]>0:
                flag=1
        if flag==1:
            d2x=i
            break
    cv.rectangle(res,(d1x,d1y),(d2x,d2y),(255,0,0))
    fourcc = cv.VideoWriter_fourcc(*'XVID')#保存
    out = cv.VideoWriter(r'C:\Users\19583\Desktop\output.avi', fourcc, 20.0, (640, 480))
    out.write(res)
    cv.imshow('frame',frame)
    #cv.imshow('mask',mask)
    cv.imshow('res',res)
    k = cv.waitKey(50) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值