【opencv】opencv透视变换和ocr识别实验

2024-05-15 10:04

本文主要是介绍【opencv】opencv透视变换和ocr识别实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实验环境:anaconda、jupyter notebook

实验用到的包opencv、numpy、matplotlib、tesseract

一、opencv透视变换

原图

图片是我拍的耳机说明书,哈哈哈哈,你也可以使用自己拍的照片,最好是英文内容,tesseract默认识别英文,识别中文需要额外训练

原图

包导入

import cv2
import matplotlib.pyplot as plt
import numpy as np

图像预处理(比例放缩)

page = cv2.imread('page.jpg')
ratio  = 500.0 / page.shape[0]
# 放缩比例
page_original = page.copy()
page_resize = cv2.resize(page_original,(int(page.shape[1] * ratio),500))plt.imshow(cv2.cvtColor(page_resize, cv2.COLOR_BGR2RGB))
plt.show()

图像比例收缩

图像转为二值图像

# 转灰度图
page_gray = cv2.cvtColor(page_resize, cv2.COLOR_BGR2GRAY)
# 高斯滤波,去除噪点
page_guassion = cv2.GaussianBlur(page_gray,(5,5),0)
# canny边缘检测
page_canny = cv2.Canny(page_guassion, 30, 100)plt.figure(figsize=(20,25))
plt.subplot(131)
plt.imshow(page_gray, 'gray')plt.subplot(132)
plt.imshow(page_guassion, 'gray')plt.subplot(133)
plt.imshow(page_canny, 'gray')plt.show()

转二值图流程

获得目标图像外轮廓

轮廓检测会得到很多的轮廓,这里通过周长比较,拿到周长最长的(在实验图像中,显然周长最长的轮廓是外轮廓)

# 轮廓检测
binary, page_contours, hierarchy = cv2.findContours(page_canny, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)page_cnt = None
page_cnt_arc = 0# 最大面积的轮廓
for page_contour in page_contours:# 算近似轮廓page_cnt_arc_temp = cv2.arcLength(page_contour,True)page_cnt_arc_approx = cv2.approxPolyDP(page_contour, 0.05 * page_cnt_arc_temp, True)# 取最大周长的轮廓page_cnt_arc_temp = cv2.arcLength(page_cnt_arc_approx,True)if page_cnt_arc_temp > page_cnt_arc:page_cnt = page_cnt_arc_approxpage_cnt_arc = page_cnt_arc_temppage_temp = page_resize.copy()
cv2.drawContours(page_temp, [page_cnt], -1, (0,255,0),2)plt.figure(figsize=(5,10))
plt.imshow(cv2.cvtColor(page_temp, cv2.COLOR_BGR2RGB))
plt.show()

外轮廓

构建透视变换的原矩阵和目标矩阵

print('原始',page_cnt)
page_cnt_deal = np.float32(page_cnt[:,0,:]) / ratio
print('处理',page_cnt_deal)
A,B,C,D = page_cnt_deal 
print('顶点',A,B,C,D)# 在原始图像上画轮廓
page_temp = page.copy()
page_cnt_deal_temp = np.array([[np.int32(A)],[np.int32(B)],[np.int32(C)],[np.int32(D)]])
print(page_cnt_deal_temp)
cv2.drawContours(page_temp, [page_cnt_deal_temp], -1, (0,255,0),10)
plt.imshow(cv2.cvtColor(page_temp, cv2.COLOR_BGR2RGB))
plt.show()W1 = np.sqrt((A[0] - B[0]) ** 2 + (A[1] -B[1]) ** 2)
W2 = np.sqrt((C[0] -D[0]) ** 2 + (C[1] -D[1]) ** 2)
W = max(int(W1), int(W2))H1 = np.sqrt((A[0] - C[0]) ** 2 + (A[1] -C[1]) ** 2)
H2 = np.sqrt((B[0] -D[0]) ** 2 + (B[1] -D[1]) ** 2)
H = max(int(H1), int(H2))# 目标坐标
dest = np.array([[0,W],[H,W],[H,0],[0,0]
], dtype=np.float32)print('目标',dest)# 在原始图像上画轮廓
page_temp = page.copy()
page_cnt_deal_temp = np.array([[np.int32(dest[0])],[np.int32(dest[1])],[np.int32(dest[2])],[np.int32(dest[3])]])
print(page_cnt_deal_temp)
cv2.drawContours(page_temp, [page_cnt_deal_temp], -1, (0,255,0),10)
plt.imshow(cv2.cvtColor(page_temp, cv2.COLOR_BGR2RGB))
plt.show()

矩阵构建1

矩阵构建2

透视变换

这里创建出的矩阵M就是原坐标矩阵pagecntdeal到目标坐标矩阵dest的变换矩阵。

# 透视变换
M = cv2.getPerspectiveTransform(page_cnt_deal, dest)
page_warped = cv2.warpPerspective(page, M, (int(H),int(W)))plt.imshow(cv2.cvtColor(page_warped, cv2.COLOR_BGR2RGB))
plt.show()

透视变换

二值化处理

这里二值化处理是为了ocr识别更清晰

# 二值化
page_warped_gray = cv2.cvtColor(page_warped, cv2.COLOR_BGR2GRAY)
res,page_warped_bin = cv2.threshold(page_warped_gray, 100,255, cv2.THRESH_BINARY)plt.imshow(page_warped_bin,'gray')
plt.show()

二值化处理

二、tesseract-orc识别

安装tesseract

ubuntu上安装非常容易

sudo apt install tesseract-ocr

查看版本号

tesseract -v

tesseract安装成功

命令行使用

在当前目录下放一张图片,你可以自己画一张

ocr命令行识别原图

tesseract 图片名称 输出文件名称

不得不说,这个算法还是有些许偏颇,像我这样写得一手好字,居然也被认错了

tesseract识别

安装pytesseract

pip install pytesseract

使用tesseract识别刚刚透视转换的结果

import pytesseracttext = pytesseract.image_to_string(page_warped_bin)
print(text)

牛逼!

orc识别结果

这篇关于【opencv】opencv透视变换和ocr识别实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/991528

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Spring Boot集成Tess4J实现OCR

1.什么是Tess4j? Tesseract是一个开源的光学字符识别(OCR)引擎,它可以将图像中的文字转换为计算机可读的文本。支持多种语言和书面语言,并且可以在命令行中执行。它是一个流行的开源OCR工具,可以在许多不同的操作系统上运行。Tess4J是一个基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本,说白了,就是封装了它的API,让Java可以直接调用。 Tess