自学了关于opencv滑动条创建的一些知识,但是编写的时候碰到了一点困难,如下:
目标是创建六个滑动条控制图片内六个图形颜色,滑动条值越大图形越黑
我的进度:
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个图形内的颜色。
基于此,我通过如下方式实现了该需求:
结果如下:
具体代码如下:
__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')