Python OpenCV:无损捕获?
我编写了一个简单的python程序,该程序使用OpenCV和scantailor cli使用文档照相机扫描文档,并将它们存储为高对比度、低文件大小的PDF 方法:Python OpenCV:无损捕获?,python,opencv,Python,Opencv,我编写了一个简单的python程序,该程序使用OpenCV和scantailor cli使用文档照相机扫描文档,并将它们存储为高对比度、低文件大小的PDF 方法: 使用OpenCV以1920 x1080的JPG格式捕获全彩文档 使用scantailor cli转换为高对比度黑白PDF 这通常是可行的,但是我发现我使用OpenCV时存在一个问题,限制了扫描的质量。我希望这里有人能给我一些改进的建议 当我使用IPEVO文档相机(可视化工具)附带的基于UI的捕获软件时,我得到了一个漂亮、清晰的捕获,它
def do_camera(device_id):
cam = cv2.VideoCapture(device_id)#,cv2.CAP_DSHOW)
w,h = 1920,1080
cam.set(cv2.CAP_PROP_FRAME_WIDTH, w)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, h)
cam.set(cv2.CAP_PROP_FORMAT, 0)
w = cam.get(cv2.CAP_PROP_FRAME_WIDTH)
h = cam.get(cv2.CAP_PROP_FRAME_HEIGHT)
grab_mode = cam.get(cv2.CAP_PROP_MODE)
format = cam.get(cv2.CAP_PROP_FORMAT)
print("capturing with w={}, h={}, grab_mode={}, format={}".format(w,h,grab_mode, format))
#ok = False
#i = -100
#while (not ok) and i < 10:
#if i != 0:
#print("setting grab_mode {}".format(grab_mode + i))
#ok = cam.set(cv2.CAP_PROP_MODE, grab_mode + i)
#i += 1
#if ok:
#gm = cam.get(cv2.CAP_PROP_MODE)
#printf("Grab mode = {}", format(gm))
cv2.namedWindow("test", cv2.WINDOW_NORMAL)
img_counter = 0
img_paths = []
while True:
ret, frame = cam.read()
if not ret:
print("failed to grab frame")
break
cv2.imshow("test", frame)
cv2.resizeWindow("test",1280,720)
cv2.moveWindow("test",1920,0)
k = cv2.waitKey(1)
if k%256 == 27:
# ESC pressed
print("Escape hit, closing...")
break
elif k%256 == 32:
# SPACE pressed
img_name = "capture_{}.png".format(img_counter)
img_path = os.path.join(capture_path, img_name)
img_paths.append(img_path)
os.makedirs(capture_path, exist_ok=True)
cv2.imwrite(img_path, frame, [cv2.IMWRITE_PNG_COMPRESSION, 0])
print("{} written!".format(img_name))
img_counter += 1
cam.release()
cv2.destroyAllWindows()
return img_paths
正如您所看到的,我选择了PNG格式,这不会导致任何类似JPEG的压缩效果。尽管有这样的选择,我还是得到了人工制品
我还尝试采用JPEG格式并将质量设置为最大。这并不能改善问题:
cv2.imwrite(img_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 100])
我能做什么?请和谢谢你我根本不知道IPEVO,所以我可能找错了方向。一些相机(如Raspberry Pi)有两种模式——静像模式和视频模式。在静像模式下,它们会过采样,运行要求更高、更有效的降噪,并产生比以30fps的速度制作视频时更低的噪声和更高的分辨率输出。使用OpenCV
videocapture()
基本上就是强迫它像摄像机一样工作。他们的静像/扫描软件可能会利用一些能力,以更高要求的“静像”模式进行操作。我只是在猜测。你可以试试看它是否能让你设置一个更低的帧速率和/或更低的ISO(灵敏度/增益)或更长的曝光时间,看看这是否有帮助。或者你可以对自己进行过采样,读取,比如说5帧或更多帧,然后取每个像素的中值。。。我想你的文件是固定的。好主意,马克。我会深入研究这些。
cv2.imwrite(img_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 100])