期中作业系列 004 Python 图形界面Kivy+ Opencv 简单图像物体计数程序

本文介绍了如何使用Python的Kivy和OpenCV库创建一个简单的图像识别界面,实现目标图片的读取、灰度转换、形态学处理及物体计数功能。通过Kivy构建GUI,允许用户进行形态学变换操作,并提供一键回退功能,方便调整和试验不同设置。最终程序展示了形态学变换在图像处理中的应用,如开运算、闭运算等。
摘要由CSDN通过智能技术生成

学习目标:

使用Kivy和OpenCV完成CIS2 期中作业


作业内容:

使用Kivy与OpenCV制作一个简单的图像识别界面
设计功能:

  1. 读取目标图片
  2. 设定结构元素
  3. 形态学处理
  4. 目标计数

目标图片 灰度图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):
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值