cv2.CAP_DSHOW 是一个视频捕获后端的标志参数,专门用于Windows平台的摄像头操作。作用如下: CAP_DSHOW 指定使用微软的 DirectShow API 作为视频捕获的后端框架。这是Windows操作系统特有的多媒体框架,用于管理视频/音频设备的输入输出
当使用默认后端(如cv2.VideoCapture(0))无法打开摄像头时,添加此参数可规避以下常见问题:
-
摄像头驱动兼容性问题
-
多摄像头切换失败
-
分辨率设置异常
-
中文路径或特殊字符导致初始化失败
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 0为摄像头索引
# 设置分辨率参数:
w = 1280, h = 720
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
# 检查手动控制支持性 焦距及曝光
focus_supported = cap.get(cv2.CAP_PROP_FOCUS) >= 0
exposure_supported = cap.get(cv2.CAP_PROP_EXPOSURE) != 0
print(f"焦距支持: {focus_supported}, 曝光支持: {exposure_supported}")
# 第一步:关闭自动对焦
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # 0表示关闭
# 第二步:设定焦距值(具体范围需查阅相机文档,普通USB摄像头常为0-255或0-1024)
cap.set(cv2.CAP_PROP_FOCUS, 300) # 示例值
设置曝光
# 第一步:关闭自动曝光(部分摄像头需设为手动模式)
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 1) # 1=手动模式
# 第二步:设置曝光值(不同相机范围差异大) # 示例:Logitech C920的曝光值范围-13到-4(越接近0越亮) # 普通摄像头可能使用0-1范围
cap.set(cv2.CAP_PROP_EXPOSURE, -7) # 示例值
自动聚焦曝光,可以按J保存图片到D盘下面,并显示 焦距 和 曝光
import cv2
cap = cv2.VideoCapture(1, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
if not cap.isOpened():
raise IOError("无法打开摄像头")
# 检查相机是否支持调焦调曝光
focus_supported = cap.get(cv2.CAP_PROP_FOCUS) >= 0
exposure_supported = cap.get(cv2.CAP_PROP_EXPOSURE) != 0
print(f"焦距支持: {focus_supported}, 曝光支持: {exposure_supported}")
# # 第一步:关闭自动对焦
cap.set(cv2.CAP_PROP_AUTOFOCUS, 1) # 0表示关闭
# 第一步:关闭自动曝光(部分摄像头需设为手动模式)
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 0) # 1=手动模式
i = 0
ret, img = cap.read()
print('输入j,下载当前图片')
print('输入q,终止程序')
while ret:
cv2.imshow('img', img)
ret, img = cap.read()
if cv2.waitKey(1) & 0xFF == ord('j'): # 按j保存一张图片
i += 1
firename = str('D:/LabelAOI/Test/' + str(i) + '.jpg')
cv2.imwrite(firename, img)
print('写入:', firename)
current_focus = cap.get(cv2.CAP_PROP_FOCUS)
current_exposure = cap.get(cv2.CAP_PROP_EXPOSURE)
print(f"当前焦距: {current_focus}, 当前曝光: {current_exposure}")
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
手动设置焦距和曝光
import cv2
def camera(cameraID, FOCUS, EXPOSURE, fun):
cap = cv2.VideoCapture(cameraID, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
if not cap.isOpened():
raise IOError("无法打开摄像头")
# 检查手动控制支持性(可选)
focus_supported = cap.get(cv2.CAP_PROP_FOCUS) >= 0
exposure_supported = cap.get(cv2.CAP_PROP_EXPOSURE) != 0
print(f"焦距支持: {focus_supported}, 曝光支持: {exposure_supported}")
# # 第一步:关闭自动对焦
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # 0表示关闭
# 第二步:设定焦距值(具体范围需查阅相机文档,普通USB摄像头常为0-255或0-1024)
cap.set(cv2.CAP_PROP_FOCUS, FOCUS) # 示例值
# 第一步:关闭自动曝光(部分摄像头需设为手动模式)
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 1) # 1=手动模式
# 第二步:设置曝光值(不同相机范围差异大)
# 示例:Logitech C920的曝光值范围-13到-4(越接近0越j亮)
# 普通摄像头可能使用0-1范围
cap.set(cv2.CAP_PROP_EXPOSURE, EXPOSURE) # 示例值
i = 0
ret, img = cap.read()
print('输入j,下载当前图片')
print('输入q,终止程序')
while ret:
cv2.imshow('img', img)
ret, img = cap.read()
if not "NA":
print("这里添加你想要做的所有功能。")
if cv2.waitKey(1) & 0xFF == ord('j'): # 按j保存一张图片
i += 1
firename = str('D:/LabelAOI/Test/' + str(i) + '.jpg')
cv2.imwrite(firename, img)
print('写入:', firename)
current_focus = cap.get(cv2.CAP_PROP_FOCUS)
current_exposure = cap.get(cv2.CAP_PROP_EXPOSURE)
print(f"当前焦距: {current_focus}, 当前曝光: {current_exposure}")
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
# 相机ID, 焦距, 曝光度, 功能(拍照/扫码)
camera(1, 75, -5, "NA")
建议先自动聚焦及曝光,获取 焦距 及 曝光度
然后手动设置以此节省排时间


1235

被折叠的 条评论
为什么被折叠?



