基于树莓派、OpenCV、Python的乒乓球识别——霍夫检测圆

import numpy as np
import math
import cv2
import cv2 as cv

cap = cv2.VideoCapture(0)
cap.set(3,320)
cap.set(4,240)
low_range = np.array([0,0,0])
high_range = np.array([255,30,255])

class Sobelxy():
       
        def sobelxy(self,img):
                self_img = img
                sobelx = cv2.Sobel(self_img,cv2.CV_64F,1,0)
                sobelx = cv2.convertScaleAbs(sobelx)
                sobely = cv2.Sobel(self_img,cv2.CV_64F,0,1)
                sobely = cv2.convertScaleAbs(sobely)

                sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
                return sobelxy
        
class Rxy():
	def rxy(self,erzhi,x,y,r):
		self_erzhi = erzhi
		self_x = x
		self_y = y
		self_r = r
		a = b = c = c1 =1
#		print("xyr",self_x,self_y,self_r)
		for l in range(self_x-self_r,self_x+self_r,3):
			if l < 0:
				l = 0
			if l > 236:
				l = 236
				
			for h in range(self_y-self_r,self_y+self_r,3):
				if h < 0:
					h = 0
				if h > 316:
					h = 316
				s = int(math.sqrt((l-self_x)**2+(h-self_y)**2))
#				print("lhs",l,h,s)
				if s <= self_r:
					print(l,h)
					a = a+self_erzhi[l,h]
					c = c+1
		for zx in range(self_x-self_r-20,self_y+self_r+20,5):
			for zy in range(self_y-self_r-20,self_y+self_r+20,5):
				b = b+self_erzhi[zx,zy]
				c1 = c1+1
		print(a/c,b/c1)
		if int(a/c) >= (int(b/c1)+50):
			print("yuan")
			cv.circle(frame1,(self_x,self_y),self_r,(255,0,0),2)
			cv.circle(frame1,(self_x,self_y),2,(255,0,0),2)
										
						

while (cap.isOpened()):
	erzhi = Rxy()
	ret,frame1 = cap.read()
	erzhi3 = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
	print(np.shape(frame1))
	cv2.imshow('2',erzhi3)
	frame = np.copy(frame1)
	frame1 = cv2.GaussianBlur(frame1,(5,5),0)
	bian = cv2.Canny(frame1,20,80)
	r1,erzhi2 = cv2.threshold(bian,128,255,cv2.THRESH_BINARY_INV)
	huofu = cv.HoughCircles(erzhi2,cv.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=0,maxRadius=0)
	if huofu != None:
			huofu = np.uint16(np.around(huofu))
			for i in huofu[0,:]:
				x = int(i[0])
				y = int(i[1])
				r = int(i[2])
				if erzhi2[y,x] and r<20 and r>5:
						erzhi.rxy(erzhi3,x,y,r)
						print("x=,y=",x,y)
						print("r=",r)
						print("erzhi2=",erzhi2[y,x])
#						cv.circle(frame1,(i[0],i[1]),i[2],(255,0,0),2)
#						cv.circle(frame1,(i[0],i[1]),2,(255,0,0),2)

	cv2.imshow('frame',frame)
	cv2.imshow('bian',bian)
	cv2.imshow('frame1',frame1)
	cv2.imshow('erzhi1',erzhi2)
	
	if cv2.waitKey(1) & 0XFF == ord('q'):
		break;

cap.release()
cv2.destroyAllWindows()

部分算法自己写的,仅供产考。

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rookie boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值