0.背景

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

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

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

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

1.opencv操作图片

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

import cv2from_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.shaperoi_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.感悟

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

转载于:https://www.cnblogs.com/rinka/p/use_opencv_to_combine_two_image.html

复印身份证所引发的一系列问题与思考相关推荐

  1. druid抛出的异常------javax.management.InstanceAlreadyExistsException引发的一系列探索

    druid抛出的异常------javax.management.InstanceAlreadyExistsException引发的一系列探索 参考文章: (1)druid抛出的异常------jav ...

  2. iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

    iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列"惨案" 前言(扯几句淡先) 回顾到学习UI过程中的九宫格布局时,发现当时学的东西真是不少. 这个阶段最大的特点就是:知识 ...

  3. python中global的使用_PYTHON中使用GLOBAL引发的一系列问题

    In [96]: def x(): b = 12 def y(): global a,b a = 1 b = 2 y() print "b =",b ....: In [97]: ...

  4. Centos 6或7系统 从Kernel panic – not syncing: Attempted to kill init 故障引发的一系列操作

    Centos 6或7系统 从Kernel panic – not syncing: Attempted to kill init 故障引发的一系列操作 Step1 问题描述 Step2 故障处理 St ...

  5. mysql 5.7.18 Can't change dir to引发的一系列问题(初始化data、改root密码)

    mysql忘记root密码需要修改root密码时,使用命令窗口输入mysqld -nt -skip-grant-tables,提示: mysqld: Can't change dir to 'c:\P ...

  6. 用公司复印机自助复印身份证技巧

    对于没有用过复印机的同事来说,第一次复印身份证总会出现复印不清晰的情况. 对于用身份证原件进行复印的情况,要把画质选项设置为照片,这样复印出来的身份证就会很清晰. 对于用身份证复印件进行复印的情况,则 ...

  7. mysql排序规则引发的一系列问题

    文章目录 mysql排序规则引发的一系列问题 背景 mysql默认的排序方式 mysql默认排序真的是按照主键进行排序的吗? 如何随机获取更优? mysql排序规则引发的一系列问题 背景 项目中提出需 ...

  8. 关于考试作弊引发的关于诚信的思考

    关于考试作弊引发的关于诚信的思考 学生考试作弊,我觉得,三分是因为学生的人品中可能有一些潜在的品质不够好,正在被环境诱导成为显性并可能开始逐渐稳定下来.外界的压力这么大,所以他们也很无奈.所以说三分是 ...

  9. 关于馒头血案引发的法律相关的思考

    关于馒头血案引发的法律相关的思考 在近段时间,无论是网络.电视.报纸等等各种可见的媒体上都引发了一场大讨论,就是针对最近胡戈在以陈凯歌的<无极>为蓝本进行重新剪辑的<一个馒头引发的血 ...

  10. 打印机复印身份证方法

    第一步:将身份证放置在A4尺寸的中间,正面向下,点击"复印"按钮-->数字1""-->"开始" 第二步:将打印出的纸张,重新放入 ...

最新文章

  1. ios app的真机调试与发布配置
  2. 威驰fs高配和低配有什么区别_“电子手刹”和“机械手刹”的区别有多大?很多车主不清楚...
  3. elasticsearch中文分词器ik-analyzer安装
  4. 堆和栈的概念和区别 python_堆和栈的区别是啥?
  5. go ip过滤_用Go实现自己的爬虫
  6. 心得体会:分治法 || 做题也有模板
  7. 李迟2021年11月知识总结
  8. android5.0+art模式,Android 5.0有哪些变化
  9. 《那些年啊,那些事——一个程序员的奋斗史》——26
  10. 用示波器对单片机I2C时序进行图形波形分析的试验小结
  11. Python多线程学习资料1
  12. Linux下C语言编程(1):IO编程
  13. cad打开a3样板图形_CAD中怎样设置A3图纸模板
  14. 2021年广东省安全员A证第三批(主要负责人)考试内容及广东省安全员A证第三批(主要负责人)新版试题
  15. 计算机概论读后感,电子商务概论读后感.doc
  16. 远程桌面无法复制粘贴问题
  17. android id设备认证失败,教大家Apple ID验证失败发生未知错误的解决方法
  18. 火车采集器html规则,火车头采集器代码过滤方法
  19. 零基础“复刻”经典飞机大战小程序游戏【一篇文使用 IVX 轻松实战5】
  20. 如何淡化疤痕留下的黑色色素

热门文章

  1. python 当天零点的时间戳
  2. 冰点还原8.53破解版
  3. java实现单词首字母小写转大写
  4. 19张网络工程师必看的思维导图
  5. 分享咖啡基础知识——从咖啡小白到咖啡发烧友需要了解的那些事儿!
  6. Django项目实战——10—(修改地址前后端逻辑、删除地址前后端逻辑、设置默认地址、修改密码、虚拟机安装docker/FastDFS、电商-商品知识、首页广告数据库表分析、商品信息数据库表分析)
  7. feign Ambiguous mapping 解决方式
  8. Vue3 Echarts散点图+高德地图+卫星地图(二)——Echarts配置散点图高德卫星地图版
  9. opengl介绍 webGL Open Inventor、Cosmo3D、Optimizer 3DLabs
  10. 2018中国服务器市场出货量年成长23%,华为出货创新高