IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 颜色匹配中的TrackBar的详细用法 -> 正文阅读

[人工智能]颜色匹配中的TrackBar的详细用法

颜色匹配

自己也是第一次学习这个小小的项目,查过一些资料后,自己总结了出来,应该比较完善。主要思路就是通过将图像转化为HSV模式(hub,saturation,value),再配合TrackBar调节参数,找到目标颜色。

TrackBar使用

TrackBar在opencv中,主要有三个函数 cv2.createTrackbar,cv2.getTrackbarPos(), cv2.setTrackbarPos(这个函数使用较少,因为第一个函数就可以实现他的功能)

cv2.createTrackbar

createTrackbar(trackbarName, windowName,value, count, onChange)

  • 第一个参数时滑动条的名字
  • 第二个参数是滑动条被放置的窗口的名字
  • 第三个参数是滑动条默认值
  • 第四个参数时滑动条的最大值
  • 第五个参数时回调函数,每次滑动都会调用回调函数

cv2.getTrackbarPos()

getTrackbarPos(trackbarname,winname)

  • 第一个参数是滑动条名字
  • 第二个时所在窗口
  • 返回值是滑动条的数值

cv2.setTrackbarPos

该函数作用就是设置滑动条的默认值,掌握第一个函数即可,这里不过多介绍

具体操作

cv2.namedWindow("TrackBars")  # 滑动控制条
cv2.resizeWindow("TrackBars", 640, 340)  # 跟踪杆显示大小
cv2.createTrackbar("Hue Min", "TrackBars", 0, 179, empty)  # 可调用的轨迹栏 ,20为默认值
cv2.createTrackbar("Hue Max", "TrackBars", 63, 179, empty)
cv2.createTrackbar("Sat Min", "TrackBars", 64, 255, empty)
cv2.createTrackbar("Sat Max", "TrackBars", 144, 255, empty)
cv2.createTrackbar("Val Min", "TrackBars", 87, 255, empty)
cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)

首先,要自己定义一个给予Trackbar的窗口,这里用到了cv2.namedWindow(),以及cv2.resizeWindow()
这里的默认值参数是通过自己调试的橙色值,这个值需要自调试寻找,
该值仅供参考。

	imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  #  H色调hue,S饱和度Saturation,V明度value
    h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
    print(h_min, h_max, s_min, s_max, v_min, v_max)
    lower = np.array([h_min, s_min, v_min])
    upper = np.array([h_max, s_max, v_max])
    mask = cv2.inRange(imgHSV, lower, upper)  # 蒙版,给予一个黑色的面板 函数设阈值,去除背景部分
    # 低于lower高于upper全都设置为0,在这之间为255
    imgResult = cv2.bitwise_and(img, img, mask=mask)  # 白色是我们所想要的,调到最后保留平滑的白色图像

接着,再将需要调用的图像转化为HSV模式,这里有个cv2.inRange()函数,cv2.bitwise_and()函数,两个配合使用

cv2.inRange()

这里拿该函数做一个掩膜

  • 第一个参数是要掩膜的图像
  • 第二,第三个参数是两个阈值

低于lower或者高于upper全都设置为0(黑色),在这之间为255(白色)

cv2.bitwise_and()

这里只介绍其配合上个函数用法,另一种用法有兴趣的可以自己查询

  • 第一个,第二个参数为掩膜图像,一般在原始图片进行
  • 第三个参数就是掩膜的阈值,上个函数已经设置好了

效果图最后展示,这里简单描述大概什么效果:在阈值内的即inRange函数的白色白色区域,他会展现原始图像中这个区域的图像,黑色区域,就显示黑色

总代码

import cv2
import numpy as np

def empty(a):  # 滑动回调函数
    pass

def stackImages(scale,imgArray):
    rows = len(imgArray)
    cols = len(imgArray[0])
    rowsAvailable = isinstance(imgArray[0], list)
    width = imgArray[0][0].shape[1]
    height = imgArray[0][0].shape[0]
    if rowsAvailable:
        for x in range(0, rows):
            for y in range(0, cols):
                if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]:
                    imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
                else:
                    imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
                if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR)
        imageBlank = np.zeros((height, width, 3), np.uint8)
        hor = [imageBlank]*rows
        hor_con = [imageBlank]*rows
        for x in range(0, rows):
            hor[x] = np.hstack(imgArray[x])
        ver = np.vstack(hor)
    else:
        for x in range(0, rows):
            if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
            else:
                imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
            if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
        hor= np.hstack(imgArray)
        ver = hor
    return ver



# path = '2.jpg'
# webcome = True
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 400)
cv2.namedWindow("TrackBars")  # 滑动控制条
cv2.resizeWindow("TrackBars", 640, 340)  # 跟踪杆显示大小
cv2.createTrackbar("Hue Min", "TrackBars", 0, 179, empty)  # 可调用的轨迹栏 ,20为默认值
cv2.createTrackbar("Hue Max", "TrackBars", 63, 179, empty)
cv2.createTrackbar("Sat Min", "TrackBars", 64, 255, empty)
cv2.createTrackbar("Sat Max", "TrackBars", 144, 255, empty)
cv2.createTrackbar("Val Min", "TrackBars", 87, 255, empty)
cv2.createTrackbar("Val Max", "TrackBars", 255, 255, empty)

while True:
    success, img = cap.read()
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  #  H色调hue,S饱和度Saturation,V明度value
    h_min = cv2.getTrackbarPos("Hue Min", "TrackBars")
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
    print(h_min, h_max, s_min, s_max, v_min, v_max)
    lower = np.array([h_min, s_min, v_min])
    upper = np.array([h_max, s_max, v_max])
    mask = cv2.inRange(imgHSV, lower, upper)  # 蒙版,给予一个黑色的面板 函数设阈值,去除背景部分
    # 低于lower高于upper全都设置为0,在这之间为255
    imgResult = cv2.bitwise_and(img, img, mask=mask)  # 白色是我们所想要的,调到最后保留平滑的白色图像


# cv2.imshow("Original",img)
# cv2.imshow("HSV",imgHSV)
# cv2.imshow("Mask", mask)
# cv2.imshow("Result", imgResult)

    imgStack = stackImages(0.5, ([img, imgHSV], [mask, imgResult]))
    cv2.imshow("Stacked Images", imgStack)

    cv2.waitKey(1)
    pass
cv2.release()
cv2.destroyWindow()



这里有一个stackImages()函数,图片的堆栈,反响大的话,单独做一个详细的讲解,这里简单说一下参数,0.5就是每个图像展示的比例,([img, imgHSV], [mask, imgResult])就是两行两列展示这些图像,展示一下效果图(这里截取的橙色)

在这里插入图片描述
还有什么不懂的地方可以下方留言或者私信!

Want to make every ordinary day overflow joy!

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:42:26  更:2021-11-11 12:45:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 6:22:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码