关于opencv中滑动条改变目标颜色的问题

自学了关于opencv滑动条创建的一些知识,但是编写的时候碰到了一点困难,如下:

目标是创建六个滑动条控制图片内六个图形颜色,滑动条值越大图形越黑

img

我的进度:

import cv2
import numpy as np

def numb(x):
    pass

cv2.namedWindow('colors')
img = cv2.imread('D:\edge\picture.png')
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

cv2.createTrackbar('LowerbH', 'colors', 0, 255, numb)
cv2.createTrackbar('LowerbS', 'colors', 0, 255, numb)
cv2.createTrackbar('LowerbV', 'colors', 0, 255, numb)
cv2.createTrackbar('UpperbH', 'colors', 0, 255, numb)
cv2.createTrackbar('UpperbS', 'colors', 0, 255, numb)
cv2.createTrackbar('UpperbV', 'colors', 0, 255, numb)

while 1:
    yel = cv2.inRange(img, (0, 200, 213), (0, 255, 255))
    blu = cv2.inRange(img, (200, 100, 0), (255, 170, 0))
    red = cv2.inRange(img, (0, 0, 200), (50, 50, 255))
    gre = cv2.inRange(img, (0, 50, 0), (100, 200, 50))
    bro = cv2.inRange(img, (0, 100, 100), (100, 150, 200))
    pup = cv2.inRange(img, (150, 50, 150), (200, 100, 200))
    #以上不知道有没有用

    lowerbH = cv2.getTrackbarPos('LowerbH', 'colors')
    lowerbS = cv2.getTrackbarPos('LowerbS', 'colors')
    lowerbV = cv2.getTrackbarPos('LowerbV', 'colors')
    upperbH = cv2.getTrackbarPos('UpperbH', 'colors')
    upperbS = cv2.getTrackbarPos('UpperbS', 'colors')
    upperbV = cv2.getTrackbarPos('UpperbV', 'colors')
   #后面不知道怎么写了
    cv2.imshow('colors', img)
    if cv2.waitKey(1) == ord('q'):
        break

本人初学者一枚,才开始学习opencv,希望有兄弟能帮忙完善或者指出我的错误,也请用尽量简单的方法完善,感激不尽


import cv2
import numpy as np

def numb(x):
    pass

cv2.namedWindow('colors')
img = cv2.imread('D:\edge\picture.png')

cv2.createTrackbar('LowerbH', 'colors', 0, 255, numb)
cv2.createTrackbar('LowerbS', 'colors', 232, 255, numb)
cv2.createTrackbar('LowerbV', 'colors', 36, 255, numb)
cv2.createTrackbar('UpperbH', 'colors', 76, 255, numb)
cv2.createTrackbar('UpperbS', 'colors', 87, 255, numb)
cv2.createTrackbar('UpperbV', 'colors', 164, 255, numb)

while 1:
    lowerbH = cv2.getTrackbarPos('LowerbH', 'colors')
    lowerbS = cv2.getTrackbarPos('LowerbS', 'colors')
    lowerbV = cv2.getTrackbarPos('LowerbV', 'colors')
    upperbH = cv2.getTrackbarPos('UpperbH', 'colors')
    upperbS = cv2.getTrackbarPos('UpperbS', 'colors')
    upperbV = cv2.getTrackbarPos('UpperbV', 'colors')

    img1 = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lower = np.array([lowerbH, lowerbS, lowerbV])
    upper = np.array([upperbH, upperbS, upperbV])
    img2 = cv2.inRange(img1, lower, upper)
    result = cv2.bitwise_not(img, img, mask=img2)

    cv2.imshow('mask', img2)
    cv2.imshow('colors', result)
    if cv2.waitKey(1) == ord('q'):
        break

查询帖子后更改的,但还是没用

你好,根据你的需求。我个人理解为,创建6个滑动条,分别控制图片内6个图形内的颜色。
基于此,我通过如下方式实现了该需求:

  1. 根据原始图像获取其中6个图形的掩码。用来分别处理对应图形的内容。
  2. 创建滑动条和回调函数。
  3. 根据滑动条给出的值,通过回调函数来处理对应的图形。

结果如下:

img

具体代码如下:

__data__ = "20221112"
__author__ = "csdn:yukun"
__description__ = "create trackbar"

import cv2
import numpy as np
import copy


def get_mask(img):
    """
    获取图像中图像的各个形状的掩码图。
    :param img: img,shape is [row, col, 3]
    :return:mask, shape is [fig_num, row, col]. fig是img图像中图形的数量。
    """
    img = 255 - img
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    contours, point = cv2.findContours(gray_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    # cv2.namedWindow("single")
    # cv2.namedWindow("org_img")
    # cv2.imshow("org_img", img)
    mask = np.zeros((len(contours), img.shape[0], img.shape[1])).astype(np.uint8)
    for i in range(len(contours)):
        temp = np.zeros(img.shape).astype(np.uint8)
        cv2.fillConvexPoly(temp, contours[i], (255, 0, 0))
        mask[i] = temp[:, :, 0]
        # cv2.imshow("single", mask[i])
        # cv2.waitKey(0)
    return mask


def nothing(*arg):
    pass


def call_back(call_dict):
    """
    回调函数,用来处理图像的。我是回调的值,给出一个比例,然后乘在原始图像上。
    :param call_dict: {'value': contours_1, 回调的值
                       'src_img': src_img,  原始图像。一直不变。
                       'img': img,          修改的图像。根据比例修改。
                       'mask': mask[0]      对应图形的掩模图
                       }
    :return:img,shape is{row, col, 3}
    """
    img = call_dict['img']
    src_img = call_dict['src_img']
    value = 1 - call_dict['value'] / 255
    img[:, :, 0][call_dict['mask'] == 255] = (src_img[:, :, 0][call_dict['mask'] == 255] * value).astype(np.uint8)
    img[:, :, 1][call_dict['mask'] == 255] = (src_img[:, :, 1][call_dict['mask'] == 255] * value).astype(np.uint8)
    img[:, :, 2][call_dict['mask'] == 255] = (src_img[:, :, 2][call_dict['mask'] == 255] * value).astype(np.uint8)
    return img


def main():
    img = cv2.imread("img.png")
    src_img = copy.deepcopy(img)
    mask = get_mask(img)
    cv2.namedWindow("colors")
    # 创建滑动条
    cv2.createTrackbar('1', 'colors', 0, 255, nothing)
    cv2.createTrackbar('2', 'colors', 0, 255, nothing)
    cv2.createTrackbar('3', 'colors', 0, 255, nothing)
    cv2.createTrackbar('4', 'colors', 0, 255, nothing)
    cv2.createTrackbar('5', 'colors', 0, 255, nothing)
    cv2.createTrackbar('6', 'colors', 0, 255, nothing)

    while 1:
        # 判断输入是否是ESC按键,如果是则退出
        if cv2.waitKey(1) == 27:
            break
        # 处理图形中第一个形状。
        # 获取滑动条的值。
        contours_1 = cv2.getTrackbarPos('1', 'colors')
        # 设置回调函数的输入。
        call_dict = {'value': contours_1,
                     'src_img': src_img,
                     'img': img,
                     'mask': mask[0]}
        # 调用回调函数
        img = call_back(call_dict)

        # 处理图形中第二个形状。
        contours_2 = cv2.getTrackbarPos('2', 'colors')
        call_dict = {'value': contours_2,
                     'src_img': src_img,
                     'img': img,
                     'mask': mask[1]}
        img = call_back(call_dict)

        # 处理图形中第三个形状。
        contours_3 = cv2.getTrackbarPos('3', 'colors')
        call_dict = {'value': contours_3,
                     'src_img': src_img,
                     'img': img,
                     'mask': mask[2]}
        img = call_back(call_dict)

        # 处理图形中第四个形状。
        contours_4 = cv2.getTrackbarPos('4', 'colors')
        call_dict = {'value': contours_4,
                     'src_img': src_img,
                     'img': img,
                     'mask': mask[3]}
        img = call_back(call_dict)

        # 处理图形中第五个形状。
        contours_5 = cv2.getTrackbarPos('5', 'colors')
        call_dict = {'value':contours_5,
                     'src_img': src_img,
                     'img': img,
                     'mask': mask[4]}
        img = call_back(call_dict)

        # 处理图形中第六个形状。
        contours_6 = cv2.getTrackbarPos('6', 'colors')
        call_dict = {'value': contours_6,
                     'src_img': src_img,
                     'img': img,
                     'mask': mask[5]}
        img = call_back(call_dict)

        #显示结果。
        cv2.imshow("colors", img)

if __name__ == "__main__":
    main()



路径问题
img = cv2.imread('D:\edge\picture.png')改成
img = cv2.imread('D:/edge/picture.png')