Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV:无损捕获?_Python_Opencv - Fatal编程技术网

Python OpenCV:无损捕获?

Python OpenCV:无损捕获?,python,opencv,Python,Opencv,我编写了一个简单的python程序,该程序使用OpenCV和scantailor cli使用文档照相机扫描文档,并将它们存储为高对比度、低文件大小的PDF 方法: 使用OpenCV以1920 x1080的JPG格式捕获全彩文档 使用scantailor cli转换为高对比度黑白PDF 这通常是可行的,但是我发现我使用OpenCV时存在一个问题,限制了扫描的质量。我希望这里有人能给我一些改进的建议 当我使用IPEVO文档相机(可视化工具)附带的基于UI的捕获软件时,我得到了一个漂亮、清晰的捕获,它

我编写了一个简单的python程序,该程序使用OpenCV和scantailor cli使用文档照相机扫描文档,并将它们存储为高对比度、低文件大小的PDF

方法:

  • 使用OpenCV以1920 x1080的JPG格式捕获全彩文档
  • 使用scantailor cli转换为高对比度黑白PDF
  • 这通常是可行的,但是我发现我使用OpenCV时存在一个问题,限制了扫描的质量。我希望这里有人能给我一些改进的建议

    当我使用IPEVO文档相机(可视化工具)附带的基于UI的捕获软件时,我得到了一个漂亮、清晰的捕获,它可以很好地转换为高对比度。当我使用OpenCV时,我会得到不需要的压缩伪影,转换为高对比度会产生不满意的结果

    完整的程序列表如下:

    相关摘录如下

    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])