zoukankan      html  css  js  c++  java
  • 复印身份证所引发的一系列问题与思考

    0.背景

    最近,准备一些材料的时候,需要用到身份证的正反面复印件。将一张卡的正反面复印到一面纸上,从来都是挺抓狂的事情。因为记不住复印完一面后,纸张是以什么样的位置放进打印机,而另一面又该怎么摆放。所以,总是喊同事帮我复印,然而,她很简单粗暴地在一张纸的正反面,分别复印身份证的正反面。不过,同事给我提供了一个方便日后复印的方法,她建议我把身份证扫描一份,电子扫描件存在电脑里,这样以后就可以直接打印了。

    我很愉快地听从她的建议,扫描我的身份证去了。然而,又一个问题出现了,扫描完成后,保存的是一个pdf文件,里面有两页,分别是我第一次扫描的身份证正面和第二次扫描的反面。如下图所示:

    这个时候,我的问题从“复印身份证正反面的技巧”变成了“如何将两页pdf合并为一页”。为此,我去下载了一个pdf编辑器,它提供了能够在页面上插入图片的功能。我试图将身份证反面的截图插入到第一页的右侧,操作成功了。但我打印出来一看,由于反面我是以截图的形式插入的,显得特别模糊。这个尝试以失败告终。

    我又转念想,那么就不勉强将正反面合成一页pdf了,在打印的时候通过“布局”,一张纸上打印两页的内容不就好了。结果打印出来一看,图片被缩小了,不是1:1的比例了。

    1.opencv操作图片

    由于我最近一直在使用opencv处理图片,我突然想到,完全可以用opencv来实现我当前的需求。我可以将这个pdf另存为两张图片,然后通过截取图2的右上区域,填到图1的右上区域。这是opencv里非常基本的操作,却一下子解决了一个令我头疼的问题。我是用的是opencv-python,代码如下:

    import cv2
    
    
    from_folder = '/Users/rinka/Desktop/'
    front_img = cv2.imread(from_folder+'id-card-front.png')
    back_img = cv2.imread(from_folder+'id-card-back.png')
    h, w, c = front_img.shape
    
    roi_back_img = back_img[0:h//2:, w//2:, :]
    front_img[0:h//2:, w//2:, :] = roi_back_img
    cv2.imwrite(from_folder+'id-card-all-in-one.png', front_img)

    2.图片的基本概念

    我们日常看到的彩色图片,转换到numpy里,就是一个三维数组。第一维和第二维通过行、列索引来操作图片上的像素点,第三维是通道,常见的为RGB三通道。我们通过行、列索引的切片操作来截取图片中的某块区域,这块区域被形象地成为ROI(region of interest),翻译过来就是“感兴趣的区域”。

    上面的场景中,我感兴趣的区域就是图2的右上区域,也就是印着我身份证反面的区域。对于行索引的切片范围,即0~图片高度的一半;对于列索引的切片范围,即图片宽度的一半~图片宽度。而对于图1,我要修改的区域也是页面的右上区域。于是,修改图1的这部分区域的像素值为图2的ROI。

    3.感悟

    学习技术,最终目的还是为了改变生活,让生活变得更加便利,将人从重复性工作中解救出来,去做更有创造力的事情。人们通过各种技术的排列组合,创造了各种各样的工具。但当有时候,现成工具无法满足当前的需求,应该从寻找工具里抽离出来,从更底层去考虑怎么通过自己已知的技术,去解决这个问题。工具虽然便利,但不要被工具所困。

  • 相关阅读:
    经典排序算法 圈排序Cycle Sort
    javascript中的封装多态和继承
    经典排序算法 珠排序Bead Sort
    经典排序算法 希尔排序Shell sort
    经典排序算法 梳排序Comb sort
    逻辑电路 晶体管Transistor
    经典排序算法 Flash Sort
    【转】一些ASP.Net开发调试环境错误的解决方法
    【原】IIS发布ASP.Net网站提示"访问IIS元数据库失败"的解决
    【SQL精彩语句】分拆列值
  • 原文地址:https://www.cnblogs.com/rinka/p/use_opencv_to_combine_two_image.html
Copyright © 2011-2022 走看看