学习目标:
使用Kivy和OpenCV完成CIS2 期中作业
作业内容:
使用Kivy与OpenCV制作一个简单的图像识别界面
设计功能:
- 读取目标图片
- 设定结构元素
- 形态学处理
- 目标计数
目标图片 灰度图1
OpenCV部分
使用cv2讀取目標圖片
img=cv2.imread("hs.png") img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
使用thresholding转为黑白图
threshold=78 imgb=cv2.threshold(imgb,threshold, 255,cv2.THRESH_BINARY)[1]
我们注意到图片中物体的间隙多为纵向细长矩形,因此我们的结构元素设定的形状为(2,10)
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (2,10))
之後 我们采取了一系列的形态学变换,使物体的边界更清晰。
最後我们调用
result=cv2.findContours(img3, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) result1=result[1] result0=result[0] result1.shape len(result0)
完成计数
但是在notebook上尝试不同的形态学变化较为麻烦。我们尝试用Kivy制作简单的GUI程序。
处理程序直接调用OpenCV的函数,使用Kivy完成界面和按键的绑定。
维护了一个栈存放当前处理的步骤来实现一键回退。
以下为後台源码:
"""
Created on Sun Nov 29 11:28:55 2020
@author: 桂江
"""
import cv2
class CvBackend():
ImageUrl=''
currentImage=''
test='Ready '
Imagelist=[]
kernel=cv2.getStructuringElement(cv2.MORPH_RECT, (2,10))
def loadImage(self,ImageUrl=""):
if not len(ImageUrl):
ImageUrl="hs.png"
img=cv2.imread(ImageUrl)
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
threshold=78
img=cv2.threshold(img,threshold,255,cv2.THRESH_BINARY)[1]
self.Imagelist=[]
self.Imagelist.append(img)
self.currentImage=img
print("image loaded")
return self.img2URL(img)
def undo(self):
if self.Imagelist==[]:
return "empty"
if len(self.Imagelist)==1:
return self.img2URL(self.Imagelist[0])
self.Imagelist.pop()
self.currentImage=self.Imagelist[-1]
return self.img2URL(self.currentImage)
def setKernel(self,shape=cv2.MORPH_RECT,size=(2,10)):
self.kernel=cv2.getStructuringElement(shape, size)
def useMrphologyEx(self,method):
temp=self.currentImage
kernel=self.kernel
temp=cv2.morphologyEx(temp,method,kernel)
self.Imagelist.append(temp)
self.currentImage=temp
return self.img2URL(temp)
def img2URL(self,img):
tempUrl="cache/temp.png"
cv2.imwrite(tempUrl, img)
return tempUrl
def count(self):
if self.currentImage=='':
return "No Images"
result=cv2.findContours(self.currentImage, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
print("counting")
return result
def save(self,num):