在 OpenCV 和 Python 中控制视频流的对比度和亮度
Controlling Contrast and Brightness of Video Stream in OpenCV and Python
我正在使用 OpenCV3 和 Python 3.7 从我的网络摄像头捕捉实时视频流,我想控制亮度和对比度。我无法使用 OpenCV 的 cap.set(cv2.CAP_PROP_BRIGHTNESS, float)
和 cap.set(cv2.CAP_PROP_BRIGHTNESS, int)
命令控制相机设置,因此我想在读取每一帧后应用对比度和亮度。每个捕获图像的 Numpy 数组是 (480, 640, 3)。以下代码可以正确显示视频流,而无需尝试更改亮度或对比度。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
当我使用 Numpy 的 clip()
方法控制对比度和亮度时,我得到了一个褪色的视频流,即使我设置了 contrast = 1.0
(对比度不变)和 brightness = 0
(亮度不变)。这是我控制对比度和亮度的尝试。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
contrast = 1.0
brightness = 0
frame = np.clip(contrast * frame + brightness, 0, 255)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
如何使用 OpenCV 控制视频流的对比度和亮度?
我找到了使用 numpy.clip()
方法的解决方案,@fmw42 提供了使用 cv2.normalize()
方法的解决方案。我更喜欢 cv2.normalize()
解决方案,因为它将像素值标准化为 0-255,而不是将它们裁剪为 0 或 255。此处提供了两种解决方案。
cv2.normalize()
解决方法:
- 亮度 - 将 alpha 和 beta 值移动相同的量。 Α
可以是负数,beta 可以高于 255。(如果 alpha >= 255,
则图片为白色,如果 beta <= 0,则图片为黑色。
- 对比度 - 扩大或缩短 alpha 和 beta 之间的差距。
代码如下:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
numpy.clip()
解决方法:
这帮助我解决了问题:。我需要:
- 首先将红-绿-蓝 (RGB) 转换为色相-饱和度-值 (HSV)
(“值”与“亮度”相同)
- 将 Numpy 数组“切片”到 Numpy 数组的值部分,并调整该切片的亮度和对比度
- 从 HSV 转换回 RGB。
这是可行的解决方案。改变 contrast
和 brightness
值。 numpy.clip()
确保每个通道(R、G 和 B)上的所有像素值都保持在 0 到 255 之间。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
contrast = 1.25
brightness = 50
frame[:,:,2] = np.clip(contrast * frame[:,:,2] + brightness, 0, 255)
frame = cv2.cvtColor(frame, cv2.COLOR_HSV2BGR)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
import cv2 as cv
cap = cv.VideoCapture(0)
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# normalize the frame
frame = cv.normalize(
frame, None, alpha=0, beta=255, norm_type=cv.NORM_MINMAX, dtype=cv.CV_8UC1
)
# Display the resulting frame
cv.imshow("frame", frame)
# press q to quit
if cv.waitKey(1) & 0xFF == ord("q"):
break
我正在使用 OpenCV3 和 Python 3.7 从我的网络摄像头捕捉实时视频流,我想控制亮度和对比度。我无法使用 OpenCV 的 cap.set(cv2.CAP_PROP_BRIGHTNESS, float)
和 cap.set(cv2.CAP_PROP_BRIGHTNESS, int)
命令控制相机设置,因此我想在读取每一帧后应用对比度和亮度。每个捕获图像的 Numpy 数组是 (480, 640, 3)。以下代码可以正确显示视频流,而无需尝试更改亮度或对比度。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
当我使用 Numpy 的 clip()
方法控制对比度和亮度时,我得到了一个褪色的视频流,即使我设置了 contrast = 1.0
(对比度不变)和 brightness = 0
(亮度不变)。这是我控制对比度和亮度的尝试。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
contrast = 1.0
brightness = 0
frame = np.clip(contrast * frame + brightness, 0, 255)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
如何使用 OpenCV 控制视频流的对比度和亮度?
我找到了使用 numpy.clip()
方法的解决方案,@fmw42 提供了使用 cv2.normalize()
方法的解决方案。我更喜欢 cv2.normalize()
解决方案,因为它将像素值标准化为 0-255,而不是将它们裁剪为 0 或 255。此处提供了两种解决方案。
cv2.normalize()
解决方法:
- 亮度 - 将 alpha 和 beta 值移动相同的量。 Α 可以是负数,beta 可以高于 255。(如果 alpha >= 255, 则图片为白色,如果 beta <= 0,则图片为黑色。
- 对比度 - 扩大或缩短 alpha 和 beta 之间的差距。
代码如下:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
numpy.clip()
解决方法:
这帮助我解决了问题:
- 首先将红-绿-蓝 (RGB) 转换为色相-饱和度-值 (HSV) (“值”与“亮度”相同)
- 将 Numpy 数组“切片”到 Numpy 数组的值部分,并调整该切片的亮度和对比度
- 从 HSV 转换回 RGB。
这是可行的解决方案。改变 contrast
和 brightness
值。 numpy.clip()
确保每个通道(R、G 和 B)上的所有像素值都保持在 0 到 255 之间。
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
contrast = 1.25
brightness = 50
frame[:,:,2] = np.clip(contrast * frame[:,:,2] + brightness, 0, 255)
frame = cv2.cvtColor(frame, cv2.COLOR_HSV2BGR)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
import cv2 as cv
cap = cv.VideoCapture(0)
while True:
# Capture frame-by-frame
ret, frame = cap.read()
# normalize the frame
frame = cv.normalize(
frame, None, alpha=0, beta=255, norm_type=cv.NORM_MINMAX, dtype=cv.CV_8UC1
)
# Display the resulting frame
cv.imshow("frame", frame)
# press q to quit
if cv.waitKey(1) & 0xFF == ord("q"):
break