程序示例精选
Python+Qt掌纹识别
如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助!
前言
这篇博客针对<<Python+Qt掌纹识别>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
文章目录
一、所需工具软件
二、使用步骤
1. 引入库
2. 代码实现
3. 运行结果
三、在线协助
一、所需工具软件
1. Python
2. Qt, OpenCV
二、使用步骤
1.引入库
import cv2
import cv2 as cv
import numpy as np
from PyQt5 import QtWidgets
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
2. 代码实现
代码如下:
class myWin(QtWidgets.QWidget, Ui_Dialog):
def __init__(self):
super(myWin, self).__init__()
self.setupUi(self)
def openFileButton(self):
imgName, imgType = QFileDialog.getOpenFileName(self,"打开文件","./","files(*.*)")
img = cv2.imread(imgName)
cv2.imwrite("temp/original.jpg", img)
height, width, pixels = img.shape
print("width,height",width,height)
print("self.label.width()",self.label.width())
print("self.label.height()",self.label.height())
if width>(self.label.width()):
rheight=(self.label.width()*height)*width
rwidth=self.label.width()
print("rwidth-if,rheight-if", width, rheight)
elif height>(self.label.height()):
rwidth=(self.label.height()*width)/height
rheight=self.label.height()
print("rwidth-elif,rheight-elfi", rwidth, rheight)
elif ((self.label.height())-height)<((self.label.width())-width):
rwidth=(self.label.height()*width)/height
rheight=self.label.height()
print("rwidth-elif,rheight-elfi", rwidth, rheight)
else:
print("rheight,rwidth", height, width)
rheight = height
rwidth = width
frame = cv2.resize(img, (int(rwidth), int(rheight)))
print("rwidth-elif,rheight-elfi", rwidth, rheight)
img2 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # opencv读取的bgr格式图片转换成rgb格式
_image = QtGui.QImage(img2[:], img2.shape[1], img2.shape[0], img2.shape[1] * 3, QtGui.QImage.Format_RGB888)
jpg_out = QtGui.QPixmap(_image).scaled(rwidth, rheight) #设置图片大小
self.label.setPixmap(jpg_out) #设置图片显示
def saveFileButton(self):
img = cv2.imread("temp/original.jpg")
file_path = QFileDialog.getSaveFileName(self, "save file", "./save/test","jpg files (*.jpg);;all files(*.*)")
print(file_path[0])
cv2.imwrite(file_path[0], img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def fingerContrast(self):
# 均值哈希算法
def aHash(img):
# 缩放为8*8
img = cv2.resize(img, (8, 8), interpolation=cv2.INTER_CUBIC)
# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# s为像素和初值为0,hash_str为hash值初值为''
s = 0
hash_str = ''
# 遍历累加求像素和
for i in range(8):
for j in range(8):
s = s + gray[i, j]
# 灰度大于平均值为1相反为0生成图片的hash值
for i in range(8):
for j in range(8):
if gray[i, j] > avg:
hash_str = hash_str + '1'
else:
hash_str = hash_str + '0'
return hash_str
# 差值感知算法
def dHash(img):
# 缩放8*8
img = cv2.resize(img, (9, 8), interpolation=cv2.INTER_CUBIC)
# 转换灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hash_str = ''
# 每行前一个像素大于后一个像素为1,相反为0,生成哈希
for i in range(8):
for j in range(8):
if gray[i, j] > gray[i, j + 1]:
hash_str = hash_str + '1'
else:
hash_str = hash_str + '0'
return hash_str
# Hash值对比
def cmpHash(hash1, hash2):
n = 0
# hash长度不同则返回-1代表传参出错
if len(hash1) != len(hash2):
return -1
# 遍历判断
for i in range(len(hash1)):
# 不相等则n计数+1,n最终为相似度
if hash1[i] != hash2[i]:
n = n + 1
return n
import os
path = "palmDataBase/"
file_list = os.listdir(path)
for file in file_list:
img1 = cv2.imread('temp/original.jpg')
BasePath="palmDataBase/" + str(file)
print("BasePath: ", BasePath)
img2 = cv2.imread(BasePath)
print("img2: ",img2)
print(hash2)
n = cmpHash(hash1, hash2)
print('均值哈希算法相似度:' + str(n))
print('差值哈希算法相似度:' + str(n))
result='相似度:' + str(100-n)+", 通过"
if n < 5:
print("file:",file)
self.textEdit.setPlainText(result)
self.textEdit_2.setPlainText("匹配成功名称:"+file)
print("n: ",n)
if width > (self.label.width()):
rheight = (self.label.width() * height) * width
rwidth = self.label.width()
print("rwidth-if,rheight-if", width, rheight)
elif height > (self.label.height()):
rwidth = (self.label.height() * width) / height
rheight = self.label.height()
print("rwidth-elif,rheight-elfi", rwidth, rheight)
elif ((self.label.height()) - height) < ((self.label.width()) - width):
rwidth = (self.label.height() * width) / height
rheight = self.label.height()
print("rwidth-elif,rheight-elfi", rwidth, rheight)
else:
print("rheight,rwidth", height, width)
rheight = height
rwidth = width
frame = cv2.resize(img2, (int(rwidth), int(rheight)))
print("rwidth-elif,rheight-elfi", rwidth, rheight)
img2 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # opencv读取的bgr格式图片转换成rgb格式
_image = QtGui.QImage(img2[:], img2.shape[1], img2.shape[0], img2.shape[1] * 3,
QtGui.QImage.Format_RGB888)
jpg_out = QtGui.QPixmap(_image).scaled(rwidth, rheight) # 设置图片大小
self.label_2.setPixmap(jpg_out) # 设置图片显示
break
else:
print("n: ", n)
self.textEdit.setPlainText("相似度太低,不通过")
self.textEdit_2.setPlainText(" ")
self.label_2.setPixmap(QPixmap(""))
if __name__=="__main__":
app=QtWidgets.QApplication(sys.argv)
Widget=myWin()
Widget.showMaximized();
Widget.show()
sys.exit(app.exec_())
3. 运行结果
三、在线协助:
如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助!
1)远程安装运行环境,代码调试
2)Qt, C++, Python入门指导
3)界面美化
4)软件制作
博主推荐文章:python人脸识别统计人数qt窗体-CSDN博客
博主推荐文章:Python Yolov5火焰烟雾识别源码分享-CSDN博客
Python OpenCV识别行人入口进出人数统计_python识别人数-CSDN博客
个人博客主页:alicema1111的博客_CSDN博客-Python,C++,网页领域博主
博主所有文章点这里:alicema1111的博客_CSDN博客-Python,C++,网页领域博主