我对图像处理和OpenCV非常陌生。我正在开发一个辅助功能,以帮助调整一些关键帧检测参数。
如果该帧是一组检测到的帧的成员,我希望能够对视频帧应用(戏剧性的)偏色,以便我可以使用此功能播放视频并查看哪些帧被检测为每个班级的成员。
如果下面的代码是其中一个类的成员,则下面的代码将简短地“保留”一个框架,并且我使用了getting started with video OpenCV-python教程中的一种简单方法,以灰度显示一个类的成员,但是由于我有多个班级,因此我需要能够将一个班级与另一个班级区分开,所以我希望能够将醒目的颜色转换应用于其他班级的成员。
我还没有看过任何有关使用OpenCV进行简单色彩调整的知识,任何帮助将不胜感激!
import cv2
def play_video(video, frames_class_a=None, frames_class_b=None, frames_class_c=None):
"""plays a video, holding and color-coding certain frames
"""
if frames_class_a is None:
frames_class_a = []
if frames_class_b is None:
frames_class_b = []
if frames_class_c is None:
frames_class_c = []
cap = cv2.VideoCapture(video)
i = 0
while(cap.isOpened()):
ret, frame = cap.read()
if not ret:
break
if i in frames_class_a:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
if cv2.waitKey(600) & 0xFF == ord('q'):
break
elif i in frames_class_b:
cv2.imshow('frame', frame) # apply "green" cast here
if cv2.waitKey(600) & 0xFF == ord('q'):
break
elif i in frames_class_c:
cv2.imshow('frame', frame) # apply "red" cast here
if cv2.waitKey(600) & 0xFF == ord('q'):
break
else:
cv2.imshow('frame', frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
i = i + 1
cap.release()
cv2.destroyAllWindows()
答案 0 :(得分:1)
想到两个简单的选项。
让我们从以下代码开始:
import cv2
import numpy as np
frame = cv2.imread('lena3.png')
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
创建与frame
相同形状的空白3通道图像。 numpy.zeros_like
是这份工作的理想之选。
然后,将灰度图像分配给一个或两个通道。例如,要使结果具有蓝色阴影,可以使用以下代码。
result = np.zeros_like(frame)
result[...,0] = gray
cv2.imwrite('shaded_lena.png', result)
要产生以下图像:
另一种选择是创建一个形状相同的临时1通道空白图像,然后使用cv2.merge
将其与灰度图像组合。
以下代码显示了所有可能的组合:
blank = np.zeros_like(gray)
shaded = [
cv2.merge([gray, blank, blank])
, cv2.merge([blank, gray, blank])
, cv2.merge([blank, blank, gray])
, cv2.merge([gray, gray, blank])
, cv2.merge([gray, blank, gray])
, cv2.merge([blank, gray, gray])
]
cv2.imwrite('shaded_lena_all.png', np.hstack(shaded))
生产此产品(为了便于显示而堆叠):