做项目时遇到一个问题,我想把一张图片的r,g,b通道分离出来显示,又希望在显示不同分辨率的图片时窗口大小能统一,就设置了一个640*480大小的窗口。但是使用imshow函数对三个通道的分别显示时,只显示了最后一个通道的图片,有什么解决办法吗?
可以使用resize函数将原图缩放至640*480大小,然后再分离通道进行显示。具体代码如下:
import cv2
# 读取原图
img = cv2.imread('test.jpg')
# 缩放至640*480大小
img_resized = cv2.resize(img, (640, 480))
# 分离通道并显示
b, g, r = cv2.split(img_resized)
cv2.imshow('Blue Channel', b)
cv2.imshow('Green Channel', g)
cv2.imshow('Red Channel', r)
cv2.waitKey(0)
cv2.destroyAllWindows()
这样可以保证不同分辨率的图片在同一个窗口下显示大小一致,同时也可以分离出RGB通道进行显示。
import cv2 as cv
import time
cap = cv.VideoCapture(0)
start_time = time.time()
counter = 0
if not cap.isOpened():
print("Cannot open camera")
exit()
def show_img(win_name,img,wait_time=0,img_ratio=0.5,is_show=True):
if is_show is not True:
return
rows = img.shape[0]
cols = img.shape[1]
cv.namedWindow(win_name, cv.WINDOW_NORMAL )#cv2.WINDOW_AUTOSIZE)
cv.resizeWindow(win_name,(int(cols*img_ratio),int(rows*img_ratio)))
cv.imshow(win_name,img)
while cap.isOpened():
# 逐帧捕获
ret, frame = cap.read(1) #ret为布尔值,frame是图片的三维数组形式
# 如果正确读取帧,ret为True
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
# 我们在框架上的操作到这里
str1 = f'size:{cap.get(3)}*{cap.get(4)}'
counter += 1
if(time.time()-start_time) != 0:
FPS = counter/(time.time()-start_time)
counter = 0
start_time = time.time()
str2 = f'FPS:{int(FPS)}'
str3 = f'{cap.get(8)}'
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(frame, str1, (5, 30), font, 1, (255, 255, 255), 2, cv.LINE_AA)
cv.putText(frame, str2, (5, 55), font, 1, (255, 255, 255), 2, cv.LINE_AA)
cv.putText(frame, str3, (5, 75), font, 1, (255, 255, 255), 2, cv.LINE_AA)
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# 显示结果帧e
cv.imshow('frame',frame)
cv.imshow('GRAY',gray)
# time.sleep(1/cap.get(cv.CAP_PROP_FPS))
if frame is not None and len(frame.shape)==3:
if frame.shape[2] == 3: # 如果是3通道,分离出3个图像实例
b, g, r = cv.split(frame)
show_img('blue', b, -1)
show_img('green', g, -1)
show_img('red', r, -1)
elif frame.shape[2] == 4: # 如果是4通道
b, g, r, a = cv.split(frame)
show_img('b', b, -1)
show_img('g', g, -1)
show_img('r', r, -1)
show_img('a', a, -1)
if cv.waitKey(1) == ord('q'):
break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()
你的提问的表达并不清晰。
我推测你的问题,是将 RGB 通道分拆为 R/G/B 三个通道,这时不能得到 R/G/B 对应的颜色,因为拆分的三个通道都是 单通道了。而单通道图像,在 CV 或其它软件中,只是一张灰度图像,而不会认为是 R\G\B 颜色图像。
如果要得到 R/G/B 颜色通道的图像,就要把 拆分的颜色通道的图像,加入另外两个通道(像素值 0),构成 3通道,这样才能显示出 R、G、B颜色通道的效果。
当然,也可以直接在 3通道图像中,依次对 RG 通道置零得到 B 通道,。。。以此类推