Files
        @ 855e8825c380
    
        
              Branch filter: 
        
    Location: OneEye/exp/stone_detect.py - annotation
        
            
            855e8825c380
            2.8 KiB
            text/x-python
        
        
    
    histogram->stone_detect, refactored
    855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380 855e8825c380  | import os
import sys
import cv2 as cv
import numpy as np
import scipy.cluster
import scipy.ndimage
from annotations import DataFile,computeBoundingBox
from hough import show
def kmeans(img):
	arr=np.reshape(img,(-1,3)).astype(np.float)
	colors=np.array([[0,0,0],[255,255,255],[193,165,116]],np.float)
	print(colors)
	(centers,distortion)=scipy.cluster.vq.kmeans(arr,colors)
	print("k-means centers:",centers)
	return centers
def quantize(img,centers):
	origShape=img.shape
	data=np.reshape(img,(-1,3))
	(keys,dists)=scipy.cluster.vq.vq(data,centers)
	pixels=np.array([centers[k] for k in keys],dtype=np.uint8).reshape(origShape)
	return pixels
def filterContours(contours,bwImg,stoneDims):
	contourImg=cv.cvtColor(bwImg,cv.COLOR_GRAY2BGR)
	res=[]
	for (i,c) in enumerate(contours):
		keep=True
		print(i)
		moments=cv.moments(c)
		center=(moments["m10"]/(moments["m00"] or 1), moments["m01"]/(moments["m00"] or 1))
		print("center:", center)
		area=cv.contourArea(c)
		print("area:",area)
		(x,y,w,h)=cv.boundingRect(c)
		print("bounding box:",(x,y,w,h))
		if w>stoneDims[0] or h>stoneDims[1]*1.3 or w<2 or h<2:
			cv.drawMarker(contourImg,tuple(map(int,center)),(0,0,255),cv.MARKER_TILTED_CROSS,12)
			keep=False
		coverage1=area/(w*h or 1)
		print("coverage1:",coverage1)
		hull=cv.convexHull(c)
		coverage2=area/(cv.contourArea(hull) or 1)
		print("coverage2:",coverage2)
		if coverage2<0.8:
			cv.drawMarker(contourImg,tuple(map(int,center)),(0,127,255),cv.MARKER_DIAMOND,12)
			keep=False
		print()
		if keep:
			res.append(c)
			cv.drawMarker(contourImg,tuple(map(int,center)),(255,0,0),cv.MARKER_CROSS)
	show(contourImg)
	return res
if __name__=="__main__":
	filepath=sys.argv[1]
	annotations=DataFile(sys.argv[2])
	filename=os.path.basename(filepath)
	(x1,y1,x2,y2)=computeBoundingBox(annotations[filename][0])
	(w,h)=(x2-x1,y2-y1)
	img=cv.imread(filepath)
	(x3,x4,y3,y4)=(x1+w//4,x1+3*w//4,y1+h//4,y1+3*h//4)
	print("x3,x4,y3,y4:",x3,x4,y3,y4)
	rect=img[y3:y4,x3:x4,:]
	centers=kmeans(rect)
	print("x1,x2,y1,y2:",(x1,x2,y1,y2))
	img[y1:y2,x1:x2,:]=quantize(img[y1:y2,x1:x2,:],centers)
	print("image quantized")
	rect=img[y1:y2,x1:x2]
	unit=np.array([1,1,1],dtype=np.uint8)
	maskB=cv.inRange(rect,centers[0]-unit,centers[0]+unit)
	maskB=cv.dilate(maskB,np.ones((3,3),np.uint8),iterations=1)
	maskB=cv.erode(maskB,np.ones((3,3),np.uint8),iterations=3)
	maskW=cv.inRange(rect,centers[1]-unit,centers[1]+unit)
	maskW=cv.erode(maskW,np.ones((3,3),np.uint8),iterations=2)
	show(img,filename)
	show(maskB,filename)
	show(maskW,filename)
	stones=cv.bitwise_or(maskB,maskW)
	show(stones)
	stoneDims=(w/19,h/19)
	print("stone dims:",tuple(x/2 for x in stoneDims),"-",stoneDims)
	(contours,hierarchy)=cv.findContours(stones,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
	filterContours(contours,stones,stoneDims)
 |