ocr數據不夠,怎么造數據

1.確定特定字體類型;

2.收集合適的圖片作為背景

3.在背景圖上填寫特定字體的字符內容

1)字體無法確認時怎么辦?

方法一:可以將文本行裁剪出來去網站上確認,網站鏈接:字體識別-在線掃一掃圖片找字體-搜字體!

方法二:將文字輸入到文檔文件中,更換不同的字體,看是否與字體目標匹配;

字體可以去網上下載,也可以在本機查找;本機的字體所在位置:

個人用戶字體文件:~/.local/share/fonts
系統字體文件:/usr/share/fonts
字體配置文件:/etc/fonts/

下面是我處理的代碼,僅供參考:

def check_dir1(path):if not os.path.exists(path):os.mkdir(path)else:files = os.listdir(path)for file in files:file_path = os.path.join(path, file)os.remove(file_path)
'''
制作一些文本行數據
'''
from PIL import ImageFont, ImageDraw
import PIL.Image as PImage
import random
import os
import numpy as np
import cv2
from rec.temporary_boundary.line_process import cut_line3_1
from result_process.preprocess import check_dir1if __name__=='__main__':cha_list = ['A','B','C','D','E','F','G','H','I','J','K',\'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']save_dir = '/home/fuxueping/4tdisk/data/certificate_reader/北京現場測試數據/20240614針對識別問題/SAU_name'check_dir1(save_dir)txt_parh = '/home/fuxueping/4tdisk/data/certificate_reader/北京現場測試數據/20240614針對識別問題/SAU_name.txt'bg_img_dir = '/home/fuxueping/4tdisk/data/certificate_reader/北京現場測試數據/20240614針對識別問題/bg'bg_imgs = os.listdir(bg_img_dir)f_save = open(txt_parh, 'w', encoding='utf-8')check_dir1(save_dir)num = 50while num:all_num = 0bg_img = random.choice(bg_imgs)num1=random.choice([2, 3])chr_str = ''all_num += num1while num1:chr_ = random.choice(cha_list)chr_str += chr_num1 -=1char_med = ''for i in range(3):num2=random.choice([5,6,7,8])chr_str2=''all_num += num2while num2:chr_ = random.choice(cha_list)chr_str2 += chr_num2 -= 1if i == 0:char_med += chr_str2+', 'elif i == 1:char_med += chr_str2 + ' 'elif i == 2:char_med += chr_str2 + ' 'chr_1 = random.choice(cha_list)result_str = chr_str+' '+char_med+chr_1all_num += 1im = PImage.open(os.path.join(bg_img_dir, bg_img))w, h = im.sizefont_size = 24w_len = int(0 + all_num * (font_size-3) + 4)if w_len > w:num -= 1continuename_font = ImageFont.truetype('/home/fuxueping/4tdisk/data/certificate_reader/北京現場測試數據/20240614針對識別問題/fonts/n019003l.pfb', font_size)draw = ImageDraw.Draw(im)y_len = random.randint(0, h-font_size-5)color = tuple([random.randint(0, 20) for _ in range(3)])draw.text((2, y_len), result_str, fill=color, font=name_font)box = (0, y_len, w_len, y_len+font_size+5)rect_img = im.crop(box)image_array = np.array(rect_img)cv2_image = cv2.cvtColor(image_array, cv2.COLOR_RGB2BGR)result, _ = cut_line3_1(cv2_image)if len(result):region_rec = cv2_image[result[1]:result[3], result[0]:min(w, result[2]+2)]  # 裁剪出待識別的區域image_array = cv2.cvtColor(region_rec, cv2.COLOR_BGR2RGB)rect_img = PImage.fromarray(image_array)# image_array = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2RGB)# rect_img = PImage.fromarray(image_array)save_path = os.path.join(save_dir, str(num)+'_'+result_str+'.jpg')line = save_path+'\t'+result_str+'\n'f_save.write(line)rect_img.save(save_path)num -= 1f_save.close()
# 根據設定的閾值和圖片直方圖,找出波峰,用于分隔字符
def find_waves_row(threshold, histogram):#行數是59# up_point = -1  # 上升點# is_peak = False# if histogram[0] >= threshold:up_point = 0 #起始位置is_peak = Truewave_peaks = []top_cut = []for i, x in enumerate(histogram): #x是對應的像素和,i是行if is_peak and x >= threshold:if i - up_point >=2 :# top_cut.append((up_point, i)) #加這一行,相當于裁減掉多于的空行up_point = i-1else:up_point = iis_peak = Falseelif not is_peak and x < threshold:#隨后找到字符消失的位置is_peak = Trueif 1 < i < histogram.shape[0]-1:#行數不是在開頭也不在結尾wave_peaks.append((up_point, i+1))else:wave_peaks.append((up_point, i))up_point = i# if is_peak and up_point != -1 and i - up_point > 4:#     wave_peaks.append((up_point, i))if not is_peak and x >= threshold:#雖然數據已經結束,但是沒有出現小于閾值的情況wave_peaks.append((up_point, i))return wave_peaksdef cut_line3_1(rgb_img, kernel_size = 3, y_len = 5, row_threshold=255 * 1, col_thresh = 255*1):'''切割出每一行,只保留高度滿足條件的一行內容,然后切除掉每一行的前端后尾端的空白'''rgb_img = method_9(rgb_img) #高斯濾波# 使用sauvola進行二值化h, w = rgb_img.shape[:2]sau_bin = sauvola_bin(rgb_img) #sauvola二值化# cv2.imwrite('./../temp/sauvola_bin.jpg', sau_bin)# sau_bin = get_charcter_region(rgb_img)  # 局部區域算閾值二值化# cv2.imwrite('./../temp/sau_bin1.jpg', sau_bin)sau_bin_inv = 255 - sau_bin# cv2.imwrite('./../temp/sau_bin_inv1.jpg', sau_bin_inv)if kernel_size != 0:sau_bin_inv = cv2.medianBlur(sau_bin_inv, kernel_size)# cv2.imwrite('./../temp/sau_bin_inv_dinose1.jpg', sau_bin_inv)col_histogram = np.sum(sau_bin_inv, axis=1)wave_peaks = find_waves_row(col_thresh, col_histogram)result = []#找出高度最大的區域,只保留一行內容max_y = 0result_y = []if not len(wave_peaks):return [], sau_bin_invfor i, wave_peak in enumerate(wave_peaks):y1 = wave_peak[0]y2 = wave_peak[1]if y2 - y1 < y_len: #20之前是這個閾值 ,將高度不滿足>=5的字符區域去掉continueif max_y < y2 - y1:max_y = y2 - y1result_y = [y1, y2]if len(result_y): #有時候裁剪的圖片可能是沒有字符,這種情況多出現在證件類別錯誤的情況y1 = result_y[0]y2 = result_y[1]else:return [], sau_bin_invline_img = sau_bin_inv[y1:y2, :]# line_img_bgr = rgb_img[wave_peak[0]:wave_peak[1], :]# save_other = os.path.join(save_path, file + '_'+str(i)+'.jpg')# cv2.imwrite(save_other, line_img)row_histogram = np.sum(line_img, axis=0)  # 數組的每一列求和# row_max = np.max(row_histogram)# row_threshold = row_max - 255*1wave_peaks_line = find_waves_col(row_threshold, row_histogram)# cv2.imwrite('./../temp/line_img.jpg', line_img)x1 = 0x2 = wresult_ = []for wave_ in wave_peaks_line:len_x = wave_[1] - wave_[0]if len_x > 5:result_.append(wave_)if len(result_):  # 有時候朝水平投影內容消失了,就用【0,w】代替x1 = result_[0][0]x2 = result_[-1][1]return [x1, y1, x2, y2], sau_bin_inv

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36313.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

將huggingface的大模型轉換為safetensor格式

很多huggingface的大語言模型都是pytorch的格式&#xff0c;但是mindie需要safetensor格式&#xff0c;另外mindieservice加載原始的baichuan2-13b的模型出錯&#xff0c;后來排查是bfloat16數據格式的問題&#xff0c;所以這次轉換要一次性轉為float16的格式。 上代碼&#x…

計算機網絡:如何隱藏真實的IP和MAC地址?

目錄 一、什么是MAC地址二、什么是IP地址三、如何隱藏真實的MAC地址四、如何隱藏真實的IP地址 一、什么是MAC地址 MAC地址&#xff0c;全稱為媒體訪問控制地址&#xff08;Media Access Control Address&#xff09;&#xff0c;是一種用于網絡通信的唯一標識符。它是由IEEE 8…

PLC網關如何選擇?plc網關作用-天拓四方

一、PLC網關在工業自動化領域的重要性和作用 PLC網關在工業自動化領域的重要性和作用不言而喻。作為工業自動化系統的重要組成部分&#xff0c;PLC網關起到了關鍵的橋梁作用&#xff0c;實現了PLC與其他設備、系統之間的數據傳輸和通信。 首先&#xff0c;PLC網關的重要性體現…

【華為OD機試】 約瑟夫問題(C++/Java/Python)

題目 題目描述 輸入一個由隨機數組成的數列(數列中每個數均是大于 0 的整數,長度已知),和初始計數值 m。 從數列首位置開始計數,計數到 m 后,將數列該位置數值替換計數值 m, 并將數列該位置數值出列,然后從下一位置從新開始計數,直到數列所有數值出列為止。 如果計數到…

最像人聲的語音合成模型-ChatTTS

目錄 寫在前面 一、使用ChatTTS 二、優點 三、局限 寫在前面 最像人聲的AI來了&#xff01;語音開源天花板ChatTTS火速出圈&#xff0c;3天就斬獲9k個star。截至發稿前&#xff0c;已經25.9k個star了。這是專門為對話場景設計的語音生成模型&#xff0c;用于LLM助手對話任務…

SUSE linux的啟動過程介紹

引導Linux系統涉及不同的組件和任務。在固件和硬件初始化過程&#xff08;取決于機器的架構&#xff09;之后&#xff0c;內核通過引導加載程序GRUB2啟動。此后&#xff0c;引導過程完全由操作系統控制并由systemd處理。systemd提供了一組“target”&#xff0c;用于為日常使用…

微信開放平臺(第三方平臺)

特征&#xff1a; 統一管理&#xff1a; 可以統一管理和操作多個公眾號和小程序&#xff0c;提供批量化、集中化的服務。 代開發和運營&#xff1a; 為公眾號和小程序提供代開發和運營服務&#xff0c;例如提供自動回復、模板消息、用戶管理等功能。 接口調用&#xff1a; 通過…

基于深度學習的模糊圖像還原

基于深度學習的模糊圖像還原 模糊圖像還原&#xff08;Image Deblurring&#xff09;是計算機視覺中的一個重要任務&#xff0c;旨在從模糊的圖像中恢復出清晰的圖像。模糊可以由于多種原因產生&#xff0c;例如相機抖動、運動模糊、焦點失準等。傳統的圖像去模糊方法通常依賴…

搭建抖音微短劇系統:源碼部署與巨量廣告回傳全解析

在數字化浪潮中&#xff0c;抖音微短劇已成為內容創作的新寵。想要搭建一個高效的抖音微短劇系統&#xff0c;并實現與巨量廣告的有效回傳嗎&#xff1f;本文將為您詳細解析源碼部署與廣告回傳的關鍵步驟。 一、源碼部署&#xff1a;構建短劇系統的基石 源碼是軟件開發的起點…

vscode遠程連接Ubantu

一、首先用VM虛擬機打開一個Linux系統 二、打開VScode 在擴展里安裝 安裝后&#xff0c;打開Linux查看IP地址 在VScode 中新建連接主機 輸入linux_nameip地址 -A 然后輸入Linux的登錄密碼 就可以遠程操控 Linux了 可以在終端中遠程控制Linux 點擊左上角的打開文件夾可以很…

什么是 Azure OpenAI?

目錄 一、說明 二、什么是 Azure OpenAI 2.1 網絡結構 2.2 、為什么使用 Azure OpenAI 2.3 如何使用 Azure OpenAI 三、從哪里開始 Azure OpenAI 之旅 3.1 關于 Azure OpenAI&#xff0c;我還需要了解什么 3.2 RBAC 權限和角色 3.3 演示 1&#xff1a;在公共數據上應用…

【面試題】網絡 http、https協議(第一篇)

1.簡述HTTP協議 HTTP&#xff0c;全名超文本傳輸協議&#xff0c;是一個用于客戶端與服務器之間進行數據傳輸的應用層協議&#xff0c;可以傳輸文本、圖片、音視頻等超文本內容。 1.HTTP使用TCP作為傳輸層協議&#xff0c;因此具有可靠性&#xff0c; 2.除此之外&#xff0c…

聚合項目學習

首先建立一個總的工程目錄&#xff0c;里邊后期會有我們的父工程、基礎工程(繼承父工程)、業務工程&#xff08;依賴基礎工程&#xff09;等模塊 1、在總工程目錄中&#xff08;open一個空的文件夾&#xff09;&#xff0c;首先建立一個父工程模塊&#xff08;通過spring init…

4面體空間內直鏈4點結構分布與占比

在30個點的4面體空間內取4個點&#xff0c;有30*29*28*27/2427405種取法&#xff0c;要求得到的4個點必須在直鏈上。只有144個結構符合要求&#xff0c;在平移操作下不重合的結構有36個。 這36個結構可以按照旋轉對稱性進一步分成3組0&#xff0c;1&#xff0c;4&#xff0c;每…

Anisble Playbook

文章目錄 一、Playbook簡介三種常見的數據格式Playbook特點YAML語言介紹 二、Playbook核心組件host組件remote_user組件task列表和action組件gather_factsHandlers notifyignore_errors 三、playbook命令playbook命令tags 標簽 四、Playbook中的變量setup模塊中的變量Playbook命…

vue3 【提效】自動路由(含自定義路由) unplugin-vue-router 實用教程

不再需要為每一個路由編寫冗長的 routes 配置啦&#xff0c;新建文件便可自動生成路由&#xff01; 使用方法 1. 安裝 unplugin-vue-router npm i -D unplugin-vue-router2. 修改 vite 配置 vite.config.ts import VueRouter from unplugin-vue-router/viteplugins 中加入 V…

消費疲軟,預期一下債券的平均收益

在預測消費疲軟對債券平均收益的影響時&#xff0c;我們需要考慮多個因素&#xff0c;包括宏觀經濟環境、貨幣政策、通脹預期以及債券市場的具體表現等。以下是對債券平均收益的預期分析&#xff1a; 宏觀經濟環境與貨幣政策&#xff1a; 當前中國經濟增速已轉向高質量發展階段…

【Redis一】Redis配置與優化

目錄 一.關系型數據庫與非關系型數據庫 1.關系型數據庫 2.非關系型數據庫 3.二者區別 4.非關系型數據庫產生背景 5.NoSQL與SQL數據記錄對比 關系型數據庫 非關系型數據庫 二.Redis相關概述 1.簡介 2.五大數據類型 3.優缺點 3.1.優點 3.2.缺點 4.使用場景 5.采用…

蘋果應用Testflight上架完整步聚

1.全部選中下圖內容,包含iPhone與iPad屏幕所有旋轉方向 2. 準備App圖標,一定要有152和167這個尺寸,不然后提交不過 3.1024這個尺寸的的圖像不能有透明層,不然提交不通過 4.選中編譯設備為Any iOS Device[arm64] 5.選擇Product下的Archive進行生成 6.在彈出的窗口中選擇Test…

Python之三大基本庫——Numpy(2)

接著上次的內容接著講&#xff0c;連續號都續上哈 七、numpu中random的隨機生成函數 以下總結的是比較常用到的函數&#xff1a; 下面分別介紹一下不用的用法&#xff1a; 首先導入創建函數 import numpy as np np.random.seed(666)1、 rand(d0,d1,d2,...,dn)&#xff1a;返…