一、
1、先装环境
conda create -n text python==3.8 -y
conda activate text
2、
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
1、连接摄像头拍摄收集数据集
capture_image5.py
import cv2 as cv
import os
import datetime
import numpy as np # 确保这一行在文件顶部
def create_directory_if_not_exists(directory):
if not os.path.exists(directory):
os.makedirs(directory)
# 鼠标点击事件的回调函数
def mouse_click(event, x, y, flags, param):
global frame, image_dir, save_count
if event == cv.EVENT_LBUTTONDOWN:
# 当鼠标左键点击时保存图片,使用PNG格式保存以确保无损
timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
image_filename = os.path.join(image_dir, f"image_{timestamp}.png")
cv.imwrite(image_filename, frame) # 使用默认参数保存PNG,确保无损
print(f"图片已保存为 {image_filename}")
save_count += 1
print(f"已保存图片总数: {save_count}")
def capture_image():
global frame, image_dir, save_count
# 初始化保存计数器
save_count = 0
# 创建存放图片的目录
image_dir = 'images_1'
create_directory_if_not_exists(image_dir)
# 尝试打开默认摄像头
cap = cv.VideoCapture(2) # 根据实际情况选择摄像头编号
if not cap.isOpened():
print("无法打开摄像头")
return
# 设置摄像头属性
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
cap.set(cv.CAP_PROP_FPS, 30)
cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc('M', 'J', 'P', 'G'))
# 尝试调整图像质量相关的属性
cap.set(cv.CAP_PROP_EXPOSURE, -6) # 调整曝光时间
cap.set(cv.CAP_PROP_GAIN, 0) # 固定增益
cap.set(cv.CAP_PROP_WHITE_BALANCE_BLUE_U, 5000) # 白平衡
cap.set(cv.CAP_PROP_CONTRAST, 0.5) # 对比度
cap.set(cv.CAP_PROP_SHARPNESS, 25) # 锐度
cap.set(cv.CAP_PROP_AUTOFOCUS, 1) # 自动对焦
# 检查对焦状态
while True:
ret, frame = cap.read()
if not ret:
print("无法获取帧")
break
# 检查对焦是否完成
if check_focus(frame):
break
print("按下 's' 键拍照,点击鼠标左键保存图片,或按 'q' 键退出")
# 设置鼠标回调函数
cv.namedWindow('Press "s" to capture an image')
cv.setMouseCallback('Press "s" to capture an image', mouse_click)
while True:
ret, frame = cap.read()
if not ret:
print("无法获取帧")
break
# 显示视频流
cv.imshow('Press "s" to capture an image', frame)
key = cv.waitKey(1) & 0xFF
# 按下 's' 键保存图片
if key == ord('s'):
timestamp = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
image_filename = os.path.join(image_dir, f"image_{timestamp}.png")
cv.imwrite(image_filename, frame) # 使用默认参数保存PNG,确保无损
print(f"图片已保存为 {image_filename}")
save_count += 1
print(f"已保存图片总数: {save_count}")
elif key == ord('q'): # 按下 'q' 键退出
print("退出程序")
break
# 释放资源
cap.release()
cv.destroyAllWindows()
def check_focus(frame):
# 使用边缘检测来检查对焦情况
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 150)
edge_count = np.sum(edges > 0)
# 如果边缘数量足够多,则认为对焦完成
return edge_count > 10000
if __name__ == "__main__":
capture_image()
1、数据集保存在images_1
2、介绍:
在代码中设置了四字符编码(FOURCC),使用了MJPG压缩格式:
3. 调整曝光和增益
一些摄像头允许通过OpenCV调整曝光时间和增益来改善图像质量:
cap.set(cv.CAP_PROP_EXPOSURE, -6) # 根据需要调整值 cap.set(cv.CAP_PROP_GAIN, 0) # 固定增益
4. 设置白平衡和对比度
适当调整白平衡和对比度也能显著提高图像清晰度:
cap.set(cv.CAP_PROP_WHITE_BALANCE_BLUE_U, 5000) # 示例值 cap.set(cv.CAP_PROP_CONTRAST, 0.5) # 对比度设置为50%
5. 使用自动对焦功能
如果摄像头支持自动对焦,请确保启用了此功能。对于某些摄像头,可以通过以下方式启用自动对焦:
cap.set(cv.CAP_PROP_AUTOFOCUS, 1)
6. 减少噪声
高分辨率图像有时会引入更多噪声。可以尝试减少噪声水平:
cap.set(cv.CAP_PROP_SHARPNESS, 25) # 锐度设置
关键点解释
全局变量:frame 和 image_dir被声明为全局变量,以便它们可以在mouse_click函数中访问。
鼠标回调函数:mouse_click函数监听鼠标事件,当检测到左键点击(cv.EVENT_LBUTTONDOWN)时,保存当前帧。
窗口名称一致:确保设置鼠标回调和显示图像的窗口名称一致,这里是'Press "s" to capture an image'。
测试与运行
当你运行这个脚本时,它会打开摄像头并显示实时视频流。此时,你可以通过以下方式保存图像:
按键操作:按下s键可以保存一张图片。
鼠标操作:点击鼠标左键也可以保存一张图片。
退出程序:按下q键可以退出程序。