第一部分 利用opencv基于hsv颜色的目标提取效果和python代码

因为做毕设,想找个地方记录一下毕设当初写的东西。

第一部分,HSV模型进行颜色提取

先放效果图:

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

图1 左右摄像头采集到的乒乓球图像
在这里插入图片描述
图 2 HSV模型颜色提取器

在这里插入图片描述
图 2 HSV模型提取的效果图

提取思路
HSV总共有三个通道,用数组表示为,[ h_min, s_min, v_min ] , [ h_max, s_max, v_max ] 。实际操作中用滑动条来逼近临界值,用二值化图像窗口直观去判断效果是否合适。
使用平台

jetracer pro kit 智能小车
jetson nano,
IMX219-31 双目摄像头

全部代码(python)
#==============================#
# ID:weixin_44115959
# Name: 小王今天找到对象了吗
#==============================#

import numpy as np
import cv2
from jetcam.csi_camera import CSICamera   # 这个是客服给的镜像中自带的关于摄像头的库
# 初始化摄像头,分辨率为 480x320
CamR = CSICamera(capture_device=0, width=480, height=320)
CamL = CSICamera(capture_device=1, width=480, height=320)
# 以下初始化,HSV三个通道上下阈值滑动条(6个)的窗口
# left,先设置左摄像头的图像,进行hsv二值化处理时的滑动条窗口
cv2.namedWindow('hsv_left') 										# 窗口名称
cv2.createTrackbar('h_up_left','hsv_left',0,255, lambda x: None) 	# h 通道的最大值
cv2.createTrackbar('s_up_left','hsv_left',0,255,lambda x: None) 	# s 通道的最大值
cv2.createTrackbar('v_up_left','hsv_left',0,255,lambda x: None) 	# v 通道的最大值
cv2.createTrackbar('h_down_left','hsv_left',0,255, lambda x: None) 	# h 通道的最小值
cv2.createTrackbar('s_down_left','hsv_left',0,255,lambda x: None)	# s 通道的最小值
cv2.createTrackbar('v_down_left','hsv_left',0,255,lambda x: None)	# v 通道的最小值
# right, 设置右摄像头的图像,进行hsv二值化处理时的滑动条窗口
cv2.namedWindow('hsv_right')										# 窗口名称
cv2.createTrackbar('h_up_right','hsv_right',0,255, lambda x: None)	# h 通道的最大值
cv2.createTrackbar('s_up_right','hsv_right',0,255,lambda x: None)	# s 通道的最大值
cv2.createTrackbar('v_up_right','hsv_right',0,255,lambda x: None)	# v 通道的最大值
cv2.createTrackbar('h_down_right','hsv_right',0,255, lambda x: None)# h 通道的最小值
cv2.createTrackbar('s_down_right','hsv_right',0,255,lambda x: None)	# s 通道的最小值
cv2.createTrackbar('v_down_right','hsv_right',0,255,lambda x: None)	# v 通道的最小值
pic_num = 1															# 如果保存图像,作为图像名称的编号
while True:
    # 读摄像头的图
    frame_right = CamR.read()	# 读图,从右摄像头实时采集图像
    frame_left= CamL.read()		# 读图,从左摄像头实时采集图像
    
    # ========= 如果不从摄像头读图,要读保存好的图片,可以将以下解除注释 ======================= #
    #frame_left = cv2.imread('C:/Users/admin/Desktop/pic_double/left' + str(pic_num) + '.jpg')
    #frame_right = cv2.imread('C:/Users/admin/Desktop/pic_double/right' + str(pic_num) + '.jpg')
    # ========= 如果不从摄像头读图,要读保存好的图片,可以将以下解除注释(结束)======================= #
    
    # 将读取的 BGR 格式图像转成 HSV 格式图像
    frame_hsv_left = cv2.cvtColor(frame_left, cv2.COLOR_BGR2HSV)	# 左
    frame_hsv_right = cv2.cvtColor(frame_right, cv2.COLOR_BGR2HSV)	# 右

    # left - 从滚动条中获取三通道的数值
    h_up_left = 255-cv2.getTrackbarPos('h_up_left', 'hsv_left')		# 获取 h 通道最大值 (用 255 去减的目的是,减少滑动滚动条)
    s_up_left = 255-cv2.getTrackbarPos('s_up_left', 'hsv_left')		# 获取 s 通道最大值
    v_up_left = 255-cv2.getTrackbarPos('v_up_left', 'hsv_left')		# 获取 v 通道最大值
    h_down_left = cv2.getTrackbarPos('h_down_left', 'hsv_left')		# 获取 h 通道最小值
    s_down_left = cv2.getTrackbarPos('s_down_left', 'hsv_left')		# 获取 s 通道最小值
    v_down_left = cv2.getTrackbarPos('v_down_left', 'hsv_left')		# 获取 v 通道最小值
    # left
    lower_left = np.array([[h_down_left, s_down_left, v_down_left]])	# 封装好三个通道的最小值,[ h_min, s_min, v_min ] 
    upper_left = np.array([[h_up_left, s_up_left, v_up_left]])			# 封装好三个通道的最大值,[ h_max, s_max, v_max ] 
    mask_left = cv2.inRange(frame_hsv_left, lower_left, upper_left)		# 将转化好的 hsv 格式图像,通过hsv阈值提取,转化成二值化图像
    # right - 和左摄像头的处理方法一样
    h_up_right = 255-cv2.getTrackbarPos('h_up_right', 'hsv_right')
    s_up_right = 255-cv2.getTrackbarPos('s_up_right', 'hsv_right')
    v_up_right = 255-cv2.getTrackbarPos('v_up_right', 'hsv_right')
    h_down_right = cv2.getTrackbarPos('h_down_right', 'hsv_right')
    s_down_right = cv2.getTrackbarPos('s_down_right', 'hsv_right')
    v_down_right = cv2.getTrackbarPos('v_down_right', 'hsv_right')
    # right
    lower_right = np.array([[h_down_right, s_down_right, v_down_right]])
    upper_right = np.array([[h_up_right, s_up_right, v_up_right]])
    mask_right = cv2.inRange(frame_hsv_right, lower_right, upper_right)
    
    # 并列显示左右摄像头经过hsv颜色提取同时二值化处理后的图片
    cv2.imshow('hsv_frame_both', np.hstack([mask_left, mask_right]))

	# 键盘响应
	# q ----- 退出程序,同时在终端上打印出三通道的上下阈值,[ h_min, s_min, v_min ] ,[ h_max, s_max, v_max ] 
	# s ----- 保存左右摄像头采集到的初始图象,以及经过hsv提取二值化处理后的图像
    if cv2.waitKey(25) & 0xFF == ord('q'):
        print("left_hsv_lower")
        print(str(h_down_left)+","+str(s_down_left)+","+str(v_down_left)) 	# 打印,左摄像头颜色提取后,hsv三通道的最小值
        print("left_hsv_up")
        print(str(h_up_left) + "," + str(s_up_left) + "," + str(v_up_left))	# 打印,左摄像头颜色提取后,hsv三通道的最大值
        print("right_hsv_lower")
        print(str(h_down_right) + "," + str(s_down_right) + "," + str(v_down_right))	# 打印,右摄像头颜色提取后,hsv三通道的最小值
        print("right_hsv_up")
        print(str(h_up_right) + "," + str(s_up_right) + "," + str(v_up_right))			# 打印,右摄像头颜色提取后,hsv三通道的最大值
        break
    if cv2.waitKey(25) & 0xFF == ord('s'):
        cv2.imwrite('frame_left'+str(pic_num)+".jpg",frame_left)	# 保存 左摄像头采集的原始图像
        cv2.imwrite('frame_right'+str(pic_num)+".jpg",frame_right)	#      右
        cv2.imwrite('hsv_mask_left'+str(pic_num)+".jpg",mask_left)		# 保存 左摄像头 hsv 二值化处理后的图像
        cv2.imwrite('hsv_mask_right'+str(pic_num)+".jpg",mask_right)	#      右
        print("pic No. "+str(pic_num )" are saved...")									# 终端打印,没什么意义,就是告诉自己,我保存了
        pic_num += 1

cv2.destroyAllWindows()		# 退出程序,关掉所有的图像窗口

好了,这是基于颜色的目标提取。

另:有问题就告诉我,我肯定会改~ 就是作业做完了,做个记录。所以不要骂我,不然我就哭给你看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值