简单的使用Pyqt5 识别图片边缘
2019-09-24 python 2879
图片识别部分:
import cv2
import numpy as np
import time
class ImageTool:
def __init__(self):
pass
def img2gray(self, file, newfile):
img = cv2.imread(file)
qimg_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite(newfile, qimg_gray)
def imgColor(self, img, color="r"):
img = cv2.imread(img, cv2.IMREAD_COLOR)
dt = dict()
dt["r"] = img[:, :, 0]
dt["g"] = img[:, :, 1]
dt["b"] = img[:, :, 2]
# r,g,b = cv2.split(img)
return dt[color]
def img2color(self, file, newfile, color="r"):
img = cv2.imread(file)
dt = dict()
dt["r"] = img[:, :, 0]
dt["g"] = img[:, :, 1]
dt["b"] = img[:, :, 2]
cv2.imwrite(newfile, dt[color])
def imgGray(self, file):
img = cv2.imread(file)
return cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
def img2pos(self, img):
h = img.shape[0]
w = img.shape[1]
color = np.array(img)
filter = 100
color_pos = dict()
xs = []
ys = []
for x in range(w):
for y in range(h):
# print("x:%d ,y: %d" % (x,y))
value = color[y][x]
flag = 0
if x - 1 >= 0 and x + 1 < w and y - 1 > 0 and y + 1 < h:
if color[y][x - 1] == 0 and value > filter:
flag = 1
elif color[y][x + 1] == 0 and value > filter:
flag = 1
elif color[y - 1][x] == 0 and value > filter:
flag = 1
elif color[y + 1][x] == 0 and value > filter:
flag = 1
if flag == 1:
xs.append(x)
ys.append(y)
color_pos["{},{}".format(x, y)] = value
return xs, ys, color_pos
def imgEdge(self, img):
xs, ys, pos = self.img2pos(img)
maxX = max(xs)
minX = min(xs)
maxY = max(ys)
minY = min(ys)
return pos, minX, maxX, minY, maxY
# img 缺口图片
# mapimg 匹配的图片
def match(self, img, mapimg):
tool = ImageTool()
mapimg = tool.imgGray(mapimg)
img = tool.imgGray(img)
edge, minX, maxX, minY, maxY = tool.imgEdge(img)
# print(mapimg.shape)
# print(img.shape)
# 获取最大 概率 坐标
rateX = 0
maxRate = 0
color = np.array(mapimg)
for ix in range(0, mapimg.shape[1] - img.shape[1]):
# print(ix,end="\t")
rate = self.matchX(ix, mapimg.shape, color, edge, img.shape)
print(rate, end="\t")
if maxRate < rate:
rateX = ix
maxRate = rate
print("\n匹配量: %d 最大可能位置:%d 权重:%.2f" % (len(edge), rateX + 3, maxRate))
def matchX(self, ix, shape, color, edge):
h = shape[0]
w = shape[1]
# 从左 向右 开始匹配 获取 左右两端 颜色色差总和最大的
colorCount = 0
for e_pos in edge:
pos = e_pos.split(",")
x = int(pos[0]) + ix
y = int(pos[1])
value = int(color[y][x])
if x - 1 >= 0 and x + 1 < w:
colorCount += abs(int(color[y][x - 1]) - value)
return colorCount
# img 缺口图片
# mapimg 匹配的图片
def matchFull(self, imgname, mapimgname, imgwh, mapimgwh, zoomx):
img = cv2.imread(imgname, -1)
img = cv2.resize(img, imgwh)
# # exit()
mapimg = cv2.imread(mapimgname)
mapimg = cv2.resize(mapimg, mapimgwh, interpolation=cv2.INTER_AREA)
#
# img_ext = os.path.splitext(imgname)
# img_resize = img_ext[0] + "_resize" + img_ext[1]
# mapimg_ext = os.path.splitext(mapimgname)
# mapimg_resize = mapimg_ext[0] + "_resize" + mapimg_ext[1]
#
# cv2.imwrite(img_resize, img)
# cv2.imwrite(mapimg_resize, mapimg)
#
# mapimg = self.imgGray(mapimg_resize)
# img = self.imgGray(img_resize)
mapimg = cv2.cvtColor(mapimg, cv2.COLOR_BGR2GRAY)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edge, minX, maxX, minY, maxY = self.imgEdge(img)
# print(mapimg.shape)
# print(img.shape)
# 获取最大 概率 坐标
rateX = 0
maxRate = 0
color = np.array(mapimg)
for ix in range(0, mapimg.shape[1] - img.shape[1]):
for iy in range(0, mapimg.shape[0] - img.shape[0]):
# print(ix,end="\t")
rate = self.matchXY(ix, iy, mapimg.shape, color, edge)
# print(rate, end="\t")
if maxRate < rate:
rateX = ix
maxRate = rate
print("\n匹配量: %d 最大可能位置:%d 权重:%d" % (len(edge), rateX + zoomx, maxRate))
return rateX + zoomx
def matchXY(self, ix, iy, shape, color, edge):
h = shape[0]
w = shape[1]
# 从左 向右 开始匹配 获取 左右两端 颜色色差总和最大的
colorCount = 0
for e_pos in edge:
pos = e_pos.split(",")
x = int(pos[0]) + ix
y = int(pos[1]) + iy
value = int(color[y][x])
if x - 1 >= 0 and x + 1 < w and y - 1 >= 0 and y + 1 < h:
colorCount += abs(int(color[y][x - 1]) - value)
return colorCount
def arr2txt(self, rgbx,min=0,max=255):
a = np.array(rgbx)
txt = []
for y in a:
tmptxt = ""
for x in y:
if x>=min and x <=max:
tmptxt += " "+str(int(x) + 1000)[1:4]
else:
tmptxt += " "
txt.append(tmptxt)
content = "\n".join(txt)
return content
# https://007.qq.com/online.html
def img2color(self,img=None,file=""):
if img is None:
img = cv2.imread(file)
else:
img = np.asarray(img)
dt = dict()
dt["r"] = img[:, :, 0]
dt["g"] = img[:, :, 1]
dt["b"] = img[:, :, 2]
dt["gray"] = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return dt
def img2txt(self, file="", txtfile="", img=None, color="gray"):
dt = self.img2color(file=file,img=img)
content = self.arr2txt(dt[color])
if txtfile != "":
with open(txtfile, "w+", encoding="utf-8") as f:
f.write(content)
return content
if __name__ == "__main__":
start = time.time()
tool = ImageTool()
# 测试规则
# tool.matchFull("./data/1.png", "./data/2.jpg",(56,56),(280,160),0)
x = tool.matchFull("./data/1.png", "./data/2.jpg", (68, 68), (341, 195), 12)
print(x + 2711 + 10)
end = time.time()
print("耗时:%.2f秒" % (end - start))图形界面部分

import sys
from PyQt5.QtWidgets import QWidget,QMainWindow,QApplication,QDesktopWidget,QHBoxLayout,QVBoxLayout,QPushButton,QLineEdit,QSpinBox,QLabel,QFileDialog
from PyQt5.QtCore import Qt,QObject
from PyQt5.QtGui import QPixmap
class CombWidget(QObject):
def __init__(self):
super().__init__()
def combHBox(self, lst: list):
h = QHBoxLayout()
for x, y in lst:
h.addWidget(x, y)
wg = QWidget()
wg.setLayout(h)
return wg
def combVBox(self, lst: list):
h = QVBoxLayout()
for x, y in lst:
h.addWidget(x, y)
wg = QWidget()
wg.setLayout(h)
return wg
def Singletonfunc(cls):
_instance = {}
def _singleton(*args, **kargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kargs)
return _instance[cls]
return _singleton
class Comimg(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.status = self.statusBar()
v = QVBoxLayout()
comb = CombWidget()
#self.imga =
self.imga_btn = QPushButton("打开图片")
self.imga_btn.clicked.connect(self.openImga)
self.imgb_btn = QPushButton("打开图片")
self.imgb_btn.clicked.connect(self.openImgb)
self.imga_lbl = QLabel("")
self.imgb_lbl = QLabel("")
# 灰度图片
self.imga_gray_lbl = QLabel("")
self.imgb_gray_lbl = QLabel("")
self.area_txt = QSpinBox()
self.area_txt.setMaximum(100)
self.area_txt.setValue(5)
v.addWidget(comb.combHBox([(self.imga_btn,2),(QLabel(""),6),(self.imgb_btn,2),(QLabel(""),6),]),2)
v.addWidget(
comb.combHBox([(self.imga_lbl, 2), ( self.imgb_lbl, 2), ]), 10)
v.addWidget(
comb.combHBox([(self.imga_gray_lbl, 2), (self.imgb_gray_lbl, 2), ]), 10)
v.addWidget(comb.combHBox([(QLabel("容错范围"), 1),(self.area_txt, 2), (QPushButton("action"), 17), ]), 4)
wg = QWidget()
wg.setLayout(v)
self.setCentralWidget(wg)
print("init ui")
self.setGeometry(300,300,800,600)
self.setWindowTitle("识别图片")
self.center()
def openImga(self):
self.status.showMessage("打开文件a")
file, ok = QFileDialog.getSaveFileName(self,
"选择图片",
"C:/Users/Administrator/Desktop/",
"图片文件 (*.png;*.jpg;*.gif)")
if ok:
self.imga_lbl.setPixmap(QPixmap(file.strip()))
self.status.showMessage(file.strip())
#self.imga_lbl.setScaledContents(True)
def openImgb(self):
self.status.showMessage("打开文件b")
file, ok = QFileDialog.getSaveFileName(self,
"选择图片",
"C:/Users/Administrator/Desktop/",
"图片文件 (*.png;*.jpg;*.gif)")
if ok:
self.imgb_lbl.setPixmap(QPixmap(file.strip()))
self.status.showMessage(file.strip())
#self.imgb_lbl.setScaledContents(True)
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
if __name__ == "__main__":
app = QApplication(sys.argv)
comimg = Comimg()
comimg.show()
sys.exit(app.exec_()) 很赞哦! (0)
相关文章
文章评论
-
-
-
0条评论