CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

OCRリーダープロトタイプ作成

2024-01-23 22:04:23 | python
Tesseractのインストールパスを次のように指定するだけで動くようになった。環境構築とか環境変数とかパスがどうのこうのとか難しいことは抜きにして、Tesseractをインストールするだけで済むようになっている。
C:Program FilesTesseract-OCR esseract.exe

各自Tesseractをどこにインストールしたか覚えておいて、上記の部分を書き換えれば良い。もちろんPyQt5とかライブラリのインストールもpip install ライブラリ名で忘れずに。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QLabel, QTextEdit, QFileDialog
from PyQt5.QtGui import QPixmap, QImage, QFont
from PIL import Image as PilImage
import pytesseract

class OCRApp(QMainWindow):
def __init__(self):
super().__init__()

self.image_path = None

# Tesseractのインストールパスを指定
tesseract_path = r'C:Program FilesTesseract-OCR esseract.exe'
pytesseract.pytesseract.tesseract_cmd = tesseract_path

self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)

self.init_ui()

def init_ui(self):
layout = QVBoxLayout()

self.image_label = QLabel("画像がここに表示されます")
layout.addWidget(self.image_label)

file_button = QPushButton("ファイルを選択", self)
file_button.clicked.connect(self.select_file)
layout.addWidget(file_button)

ocr_button = QPushButton("OCR実行", self)
ocr_button.clicked.connect(self.perform_ocr)
layout.addWidget(ocr_button)

self.result_text = QTextEdit("OCR結果がここに表示されます")
layout.addWidget(self.result_text)

self.central_widget.setLayout(layout)

def select_file(self):
options = QFileDialog.Options()
options |= QFileDialog.ReadOnly
file_path, _ = QFileDialog.getOpenFileName(self, "ファイルを選択", "", "Images (*.png *.jpg *.jpeg);;All Files (*)", options=options)
if file_path:
self.image_path = file_path
self.display_selected_image()

def display_selected_image(self):
try:
pil_image = PilImage.open(self.image_path)
pil_image = pil_image.resize((300, 300)) # サイズを適当に変更

qimage = self.pil_image_to_qimage(pil_image)
pixmap = QPixmap.fromImage(qimage)

self.image_label.setPixmap(pixmap)
except Exception as e:
self.result_text.setPlainText(f"Error: {str(e)}")

def pil_image_to_qimage(self, pil_image):
width, height = pil_image.size
bytes_per_line = 3 * width
image = QImage(pil_image.tobytes("raw", "RGB"), width, height, bytes_per_line, QImage.Format_RGB888)
return image

def perform_ocr(self):
if self.image_path:
try:
image = PilImage.open(self.image_path)
text = pytesseract.image_to_string(image, lang='jpn')
self.result_text.setPlainText(text)
except Exception as e:
self.result_text.setPlainText(f"Error: {str(e)}")
else:
self.result_text.setPlainText("ファイルが選択されていません.")

if __name__ == "__main__":
app = QApplication(sys.argv)

# フォントをMS Gothicに設定
font = QFont("MS Gothic", 12)
app.setFont(font)

window = OCRApp()
window.setWindowTitle("OCR Reader")
window.setGeometry(100, 100, 500, 500)
window.show()

sys.exit(app.exec_())

結果は上々、後はディープラーニングでチューニングできるように改造するだけ。


画像ファイルをフォルダーごとリサイズできるPythonソースコード

2024-01-23 04:36:53 | python
import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QFileDialog, QVBoxLayout, QWidget, QLineEdit
from PyQt5.QtCore import Qt
from PIL import Image

class ImageResizerApp(QMainWindow):
def __init__(self):
super().__init__()

self.folder_path = ""
self.target_size = (0, 0)

self.init_ui()

def init_ui(self):
self.setWindowTitle("画像リサイズプログラム")

central_widget = QWidget(self)
self.setCentralWidget(central_widget)

layout = QVBoxLayout()

self.label = QLabel("1. フォルダを選択してください", self)
self.label.setAlignment(Qt.AlignCenter)
layout.addWidget(self.label)

self.select_button = QPushButton("フォルダを選択", self)
self.select_button.clicked.connect(self.choose_folder)
layout.addWidget(self.select_button)

self.label_size = QLabel("2. 新しいサイズを入力してください (幅 x 高さ):", self)
self.label_size.setAlignment(Qt.AlignCenter)
layout.addWidget(self.label_size)

size_layout = QVBoxLayout()

self.width_entry = QLineEdit(self)
self.width_entry.setPlaceholderText("幅")
size_layout.addWidget(self.width_entry)

self.height_entry = QLineEdit(self)
self.height_entry.setPlaceholderText("高さ")
size_layout.addWidget(self.height_entry)

layout.addLayout(size_layout)

self.resize_button = QPushButton("リサイズ", self)
self.resize_button.clicked.connect(self.resize_images)
layout.addWidget(self.resize_button)

central_widget.setLayout(layout)

def choose_folder(self):
folder_path = QFileDialog.getExistingDirectory(self, "フォルダを選択", "", QFileDialog.ShowDirsOnly)

if folder_path:
self.folder_path = folder_path
self.label.setText(f"1. 選択されたフォルダ: {folder_path}")

def resize_images(self):
if not self.folder_path:
self.label.setText("エラー: フォルダが選択されていません")
return

width_text = self.width_entry.text()
height_text = self.height_entry.text()

if not width_text or not height_text:
self.label.setText("エラー: サイズが指定されていません")
return

try:
new_width = int(width_text)
new_height = int(height_text)
self.target_size = (new_width, new_height)
except ValueError:
self.label.setText("エラー: 正しい数値を入力してください")
return

image_extensions = ['.png', '.jpg', '.jpeg', '.gif']
for root, dirs, files in os.walk(self.folder_path):
for file in files:
if file.lower().endswith(tuple(image_extensions)):
image_path = os.path.join(root, file)
try:
original_image = Image.open(image_path)
resized_image = original_image.resize(self.target_size, Image.ANTIALIAS)
resized_image.save(image_path)
except Exception as e:
print(f"エラー: {e}")

self.label.setText(f"3. 画像をリサイズしました。")

if __name__ == "__main__":
app = QApplication(sys.argv)
image_resizer_app = ImageResizerApp()
image_resizer_app.show()
sys.exit(app.exec_())

結果はPCで成功!
上司が運転する車内でSDカード内のフォルダーごと試してみたら、固まりながらも見事にリサイズできてしまった。

ドラッグ&ドロップ方式ではどうしても上手く動かなかったので、フォルダーごとリサイズに変更した。

次はAI OCRリーダーを作ってみたい。
蔵衛門での写真管理で早く楽できるようにしたい!