大学招生网站建设,如何创建小程序商店,智能网站建设步骤,培训机构课程设置计算机视觉废钢堆提取问题
背景介绍
在钢铁炼制中#xff0c;废钢是非常重要的原料#xff0c;不同等级废钢对于钢成品影响很大#xff0c;因此需要对废钢进行正确分类。某废钢料场中#xff0c;卸料区域布置了多个摄像头#xff0c;用于拍摄卸料场中废钢堆#xff0c;…计算机视觉废钢堆提取问题
背景介绍
在钢铁炼制中废钢是非常重要的原料不同等级废钢对于钢成品影响很大因此需要对废钢进行正确分类。某废钢料场中卸料区域布置了多个摄像头用于拍摄卸料场中废钢堆如下几个图所示。后续处理中需要先将废钢蟭有效提取出来减少背景的影响。效果如下所示。 图 1 未处理图像1 图 2 处理后图像1
2. 程序设计思路及主要方法
本次实验基于OpenCV的 GrabCut图像分割算法。GrabCut是一种交互式分割方法该方法使用图论的max-flow/min-cut算法从图像的背景中提取前景。在算法开始之前用户首先需要提供一些提示大致在输入图像中指定前景区域尽可能减少交互(例如在前景区域周围绘制一个矩形);然后使用该法对图像进行迭代分割得到可能的最佳结果。在某些情况下分割可能不是理想的(例如算法可能将一些前景区域标记为背景反之亦然)。 用于图论Grabcut算法实现。参数img为待分割输入图像要求必须是8位3通道mask为输入/输出掩码图像rect分割目标的ROI限定区域范围该窗口内的像素被处理bgdModel为背景模型的临时储存数组fgdModel为前景模型的临时储存数组。 利用OpenCV进行图割算法实时显示首先需要定义分割矩形区域利用Grabcut完成前景与背景图像分离利用图像匹配得到分割结果具体实验结果展示如下。
实验结果展示 图 4 未处理图像2
图 5 已处理图像2 图 8 未处理图像4 图 9 已处理图像4
代码如下 import numpy as np //导入依赖库
import cv2#鼠标事件的回调函数
def on_mouse(event,x,y,flag,param): global rectglobal leftButtonDowmglobal leftButtonUp#鼠标左键按下if event cv2.EVENT_LBUTTONDOWN:rect[0] xrect[2] xrect[1] yrect[3] yleftButtonDowm TrueleftButtonUp False#移动鼠标事件if event cv2.EVENT_MOUSEMOVE:if leftButtonDowm and not leftButtonUp:rect[2] xrect[3] y #鼠标左键松开if event cv2.EVENT_LBUTTONUP:if leftButtonDowm and not leftButtonUp:x_min min(rect[0],rect[2])y_min min(rect[1],rect[3])x_max max(rect[0],rect[2])y_max max(rect[1],rect[3])rect[0] x_minrect[1] y_minrect[2] x_maxrect[3] y_maxleftButtonDowm False leftButtonUp True//加载图像指定输入图像的路径
img cv2.imread(rE:\Users\SongpingWang\Desktop\the_angry_birds_movie.jpg)
mask np.zeros(img.shape[:2],np.uint8) //创建掩码蒙版//创建临时数组
bgdModel np.zeros((1,65),np.float64) #背景模型
fgdModel np.zeros((1,65),np.float64) #前景模型
rect [0,0,0,0] #设定需要分割的图像范围leftButtonDowm False #鼠标左键按下
leftButtonUp True #鼠标左键松开cv2.namedWindow(img) #指定窗口名来创建窗口
cv2.setMouseCallback(img,on_mouse) #设置鼠标事件回调函数 来获取鼠标输入
cv2.imshow(img,img) #显示图片while cv2.waitKey(2) -1:#左键按下画矩阵if leftButtonDowm and not leftButtonUp: img_copy img.copy()cv2.rectangle(img_copy,(rect[0],rect[1]),(rect[2],rect[3]),(0,255,0),2) cv2.imshow(img,img_copy)#左键松开矩形画好 elif not leftButtonDowm and leftButtonUp and rect[2] - rect[0] ! 0 and rect[3] - rect[1] ! 0:rect[2] rect[2]-rect[0]rect[3] rect[3]-rect[1]rect_copy tuple(rect.copy()) rect [0,0,0,0]#物体分割cv2.grabCut(img,mask,rect_copy,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)mask2 np.where((mask2)|(mask0),0,1).astype(uint8)img_show img*mask2[:,:,np.newaxis]#显示图片分割后结果--显示原图cv2.imshow(grabcut,img_show)cv2.imshow(img,img) cv2.waitKey(0)
cv2.destroyAllWindows()