前言

手机文本扫描工具(类似扫描王)是日常经常用到的一个工具,一般过程是先拍一下所要扫描的文件(证件、纸张),然后在手机软件上调整文件的扫描区域,一般是拖动四个角点调整,调整完后,扫描软件就会把扫描区域里面的文件提取出来,成为一个较为规则的矩形。本篇来简单实现这样一个功能,效果如下:

鼠标移动四个顶点,程序可以把长方形的文件截取出来,并进行了变形校正,简单达到了扫描效果(左图):

原理

原理很简单,就是利用本工具集的“机器视觉实用工具集NO.1——根据任意矩形(四点坐标)截取指定区域图像”https://blog.csdn.net/kanbide/article/details/122663535的工具,把四个顶点里的区域给截取出来。当然,为了方便手动鼠标调整,利用了opencv窗口的鼠标响应事件,可以通过鼠标左键点击某个顶点周边的位置,顶点的坐标换成点击的坐标,这样就完成了顶点的调整功能。

Python代码实现

# -*- coding: utf-8 -*-
"""
Created on Sat Apr  2 16:29:20 2022@author: JAMES FEI
Copyright (C) 2022 FEI PANFENG, All rights reserved.
THIS SOFTEWARE, INCLUDING DOCUMENTATION,IS PROTECTED BY COPYRIGHT CONTROLLED
BY FEI PANFENG ALL RIGHTS ARE RESERVED.
"""#
import numpy as np
import cv2img=cv2.imread("test.png")
H=img.shape[0]
W=img.shape[1]
points=[[50,H-50],[50,50],[W-50,50],        [W-50,H-50]]def onMouse(event, x, y, flags, param):global clicked,points #声明引用全局变量if event == cv2.EVENT_LBUTTONDOWN: #鼠标点击弹起事件 print(x,y)r=100000000pi=5for i in range(len(points)):            if r>((x-points[i][0])**2+(y-points[i][1])**2):r=(x-points[i][0])**2+(y-points[i][1])**2pi=iprint("point:",pi)if pi!=5:print(points)points[pi]=[x,y]        cv2.namedWindow('image') #创建窗口def drawRec(img,points):"""画出扫描矩形区域"""for i in range(len(points)):        cv2.circle(img, (points[i][0],points[i][1]), 10, (0,255,0), 2) if i!=3:cv2.line(img, (points[i][0],points[i][1]),(points[i+1][0],points[i+1][1]), (0,255,0), 4)else:cv2.line(img, (points[i][0],points[i][1]),(points[0][0],points[0][1]), (0,255,0), 4)return imgdef CutImgeByBox(output,box):"""根据任意内接矩形,四点(顺时针)box[[x1,y2],[x2,y2],[x3,y3],[x4,y4]],从输入图像中,截取图像"""if type(box)==type([]):    pts1 = np.float32(box)if pts1.shape==(4,2):# 变换后的矩形四个顶点坐标    dy=int(np.sqrt((box[0][0]-box[1][0])**2+(box[0][1]-box[1][1])**2))dx=int(np.sqrt((box[1][0]-box[2][0])**2+(box[1][1]-box[2][1])**2))   pts2 = np.float32([[1, dy+1],[1, 1],[1+dx, 1],[1+dx, 1+dy]]) M = cv2.getPerspectiveTransform(pts1,pts2)dst = cv2.warpPerspective(output, M, (output.shape[1],output.shape[0]))   target = dst[int(pts2[1][1]):int(pts2[0][1]),int(pts2[1][0]):int(pts2[2][0]),:]return True,targetelse:print("box shape is wrong ,must be list as (4,2)")return False,outputelse:print("box type is wrong,must be list as [[x1,y2],[x2,y2],[x3,y3],[x4,y4]]")return False,outputcv2.setMouseCallback('image',onMouse) #设置窗口鼠标回调函数while True:pimg=drawRec(img.copy(),points)cv2.imshow('image',pimg) res,output=CutImgeByBox(img,points)if res:cv2.imshow('cutimage',output) k=cv2.waitKey(1)if k == ord("q"):breakcv2.destroyAllWindows()

机器视觉实用工具集NO.15——利用图像放射变换做类似文件扫描仪效果工具相关推荐

  1. 机器视觉实用工具集NO.13——利用直方图平衡及色阶构建图像去雾、增亮等预处理操作工具

    前言 有时候,拍摄的图片会由于环境光.相机曝光度等原因造成图像有层类似雾的灰度或者是颜色失真等现象,图像直方图表现为在某个阈值区间有较多像素聚集,可以通过opencv的equalizeHist函数对图 ...

  2. 利用vc的mfc做的Excel表格处理工具

    下面两个文件是逻辑处理文件.已经调通. CExcelmadetoolDlg.h 在这里插入代码片 // ExcelmadetoolDlg.h : header file //#if !defined( ...

  3. 利用python制作的可视化批量文件后缀处理工具

    本篇文章主要讲解可视化开发的方式,通过批量替换文件后缀的形式来讲解可视化的pc应用开发 日期:2021年12月25日 作者:任聪聪 效果展示 代码实例 整体代码 from tkinter import ...

  4. 利用Excel VBA SQL做特殊文件浏览器

    1.利用JamShellBrowser for ActiveX '转载请注明:本文来自:Excel吧 (www.excelba.com) 详细出处参考:http://www.excelba.com/A ...

  5. 猿如意前端工具集使用体验

    猿如意前端工具集使用体验 CSDN最近发布了一款应用"猿如意",里面有很多开发相关的工具软件.今天正好把手里里工作忙完,于是准备下载体验一番. 打开猿如意,输入"前端&q ...

  6. xperf工具集的介绍

    转自 iteam的共享空间 的日志 xperf 是Windows Performance Tools Kit中的一个工具,这一系列强大的工具包主要针对操作系统启动阶段和关闭阶段进行底层的日志捕捉和性能 ...

  7. (翻译)LearnVSXNow! #6 - 创建我们第一个工具集 - 序幕

    在前面的文章中,我们在向导的帮助下创建了一些小的VSPackages.在第五讲中我们整理了VSX的一些思路和概念,深入VSPackages 了解了packages如何工作以及服务的机制.在这篇文章中我 ...

  8. Aveiconifier是一个非常实用方便的制作ico格式文件的小工具~

    本文地址:http://www.jb51.net/article/8314.htm Aveiconifier是一个非常实用方便的制作ico格式文件的小工具~ 也许有一些对网页知识不是很了解的网友并不清 ...

  9. linux的系统移植——交叉编译工具集

    1.交叉编译工具集 \qquad 在我们安装交叉工具集时,不仅安装了arm-linux-gnueabi-gcc ,还安装了很多工具,它们共同构成交叉编译工具集. arm-linux-gnueabi-a ...

  10. GitForWindows工具集(GitBash命令行)

    1.Git For Windows工具集 Git For Windows专注于提供一套轻量级的本地工具集, 它将Git SCM的完整功能集引入Windows, 同时为Git用户提供适当的用户界面, 方 ...

最新文章

  1. 全网最简单的dubbo源码调试,建议点赞收藏!!!
  2. 未来智能:人有人用,机有机用
  3. lscpu命令查看CPU统计信息
  4. SharePoint的WebService的应用
  5. python怎么new对象_Python使用__new__()方法为对象分配内存及返回对象的引用示例
  6. Spring Boot整合Spring Data Redis-整合步骤
  7. 电脑的引导启动快捷键
  8. Servlet 服务器 HTTP 响应
  9. 这份中台与数据报表的干货我写了10小时,真不想告诉你
  10. 软件测试开发人员的价值如何体现?
  11. 简仿Path的商店表情弹出模块
  12. Mac下nginx配置虚拟主机,访问报错502
  13. 守望先锋--颜色参数
  14. srt格式导入pr乱码_PR软件导入字幕文件后显示乱码如何解决
  15. php左斜线和右斜线,左斜杠和右斜杠分别有什么意义?
  16. 重庆大学计算机学院专硕分析,重庆大学电子信息(专硕)专业考研难度分析-专业排名-难度大小...
  17. usgs dem 导入matlab 程序,用GDAL打开从USGS下载的img影像文件
  18. centos8搭建maven私服(含nexus-3.28.1-01.tar.gz下载链接)
  19. Johnson-Trotter(生成排列算法)
  20. Java实现 LeetCode 400 第N个数字

热门文章

  1. 基于ROS的A*算法代码学习
  2. 双稳态一键开关机电路
  3. 搭建一个基于 Vue + Vant 的移动端项目模板
  4. 关于ARP请求报文和ARP报文的源地址和目的地址
  5. 腾讯云最便宜的云服务器多少钱可以入坑?
  6. js中的设计模式之单例模式
  7. mysql数据丢失原因_分析mysql数据丢失的问题
  8. android数据恢复实现,5款免费的Android数据恢复应用
  9. 苹果工具条_如何在苹果官网获取 iOS 13 描述文件?iOS 13 公测版升级教程
  10. PTA甲级 1114 Family Property (25 point(s))