OpenCV_Task02:图像的基础操作、色彩空间

思考题:

1、HSV和BGR三原色在图片信息存储的差别在哪?

答:

  • 全彩图像RGB:颜色通道(红、绿、蓝),三层,每层的0-255代表该层颜色的亮度,opencv里是BGR
  • HSV:色调(H),饱和度(S),明度(V),增加黑色V减小,增加白色S减小

练习题:

1、编写一段程序实现以下功能:

代码调用电脑摄像头,寻找视野中任意颜色(自定)并具有一定大小的物体,并用矩形框处,最后显示在图像上;
答:源码是从别人的博客copy的,但是自己查了一遍需要的使用API,并附上了注释
OpenCV_Task02:图像的基础操作、色彩空间_第1张图片

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np

# 读取视频
capture = cv.VideoCapture(0)                        #参数0调用主机摄像头
height = capture.get(cv.CAP_PROP_FRAME_HEIGHT)      #视频流的帧高度
width = capture.get(cv.CAP_PROP_FRAME_WIDTH)        #视频流的帧宽度
fps = capture.get(cv.CAP_PROP_FPS)                  #帧率
print(height, width, fps)

def process(image, opt=1):
    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
    # RGB转HSV色彩空间

    line = cv.getStructuringElement(cv.MORPH_RECT, (15, 15), (-1, -1))
    # getStructuringElement函数会返回指定形状和尺寸的结构元素
    # 参数1:内核的形状,有三种形状可以选择
    #   矩形:MORPH_RECT;
    #   交叉形:MORPH_CROSS;
    #   椭圆形:MORPH_ELLIPSE;
    # 参数2:内核的尺寸
    # 参数3;锚点的位置

    mask = cv.inRange(hsv, (11, 43, 46), (34, 255, 255))
    # inRange()函数可实现二值化功能,主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)
    # 参数1:输入要处理的图像,可以为单通道或多通道
    # 参数2:包含下边界的数组或标量
    # 参数3:包含上边界数组或标量

    mask = cv.morphologyEx(mask, cv.MORPH_OPEN, line)
    # 开运算,消除小的亮点
    # 参数1:要处理的图像
    # 参数2;处理方式,这里为开运算
    # 参数3:核结构

    contours, hierarchy = cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    # 轮廓提取, 发现最大轮廓
    # 参数1:源图像
    # 参数2:轮廓的检索方式,cv.RETR_EXTERNAL只寻找最高层级的轮廓
    # 参数3:一般用 cv.CHAIN_APPROX_SIMPLE,就表示用尽可能少的像素点表示轮廓
    # contours:图像轮廓坐标,是一个链表
    # hierarchy:[Next, Previous, First Child, Parent]

    for i in contours:
            x, y, w, h = cv.boundingRect(i)  # 将轮廓分解为识别对象的左上角坐标和宽、高
            # 在图像上画上矩形(图片、左上角坐标、右下角坐标、颜色、线条宽度)
            if min(image.shape[0], image.shape[1]) / 10 < min(h, w) \
                    < min(image.shape[0], image.shape[1]) / 1:
                cv.rectangle(image, (x, y), (x + w, y + h), (0, 255,), 3)
                # 给识别对象写上标号
                font = cv.FONT_HERSHEY_SIMPLEX
                cv.putText(image,'' , (x - 10, y + 10), font, 1, (0, 0, 255), 2)  # 加减10是调整字符位置
    return image
# 循环处理每一帧
while(True):
    ret, frame = capture.read()
    if ret is True:
        result = process(frame)
        cv.imshow("result", result)
        c = cv.waitKey(50)
        if c == 27:  #ESC
            break
    else:
        break
cv.waitKey(0)
cv.destroyAllWindows()

附:目标跟踪、颜色识别(inRange 如何寻找目标HSV值)

https://blog.csdn.net/LNL_LNL/article/details/99675801

你可能感兴趣的:(opencv,python,计算机视觉,图像识别)