树莓派搭建图像识别基站

博主最近参加一个比赛,需要识别白色纸片上的黑色胶带,由于单片机跑不了opencv等一些高级算法,于是就想到了用树莓派 + python 跑opencv,实际测试效果还挺好
下面贴代码
#coding=utf_8
import multiprocessing
from threading import Timer
import numpy as np
import cv2
import time

i = 0
time_interval = 1.0
lower_blue = np.array([0,0,0])
upper_blue = np.array([170,255,46])
cap = cv2.VideoCapture(0)//打开Pi摄像头

area_max = 19000  //最大面积
area_min = 6000   //最小面积

pyserial_test=serial.Serial("/dev/ttyS0",115200)

###########################计算帧率函数############################################
def frame_rate():
	global i
	x = i
	print x
	i = 0
	t = Timer(time_interval,frame_rate)
	t.start()

#####################################################################################



###########################主图像处理函数############################################
def main():
	uart_send_data = multiprocessing.Process(name = "uart_send_data",
			target = uart_send,
			args = ())
	while(True):
		global i
		i = i + 1
		X = []
		Y = []
		 ret, frame = cap.read()
		gray   = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
		canny = cv2.Canny(gray, 30, 150)
		contours, hierarchy = cv2.findContours(
							canny,
							cv2.RETR_TREE,
							cv2.CHAIN_APPROX_NONE)
		#寻找轮廓
		F = []
		for j in range(len(contours)):
			area = cv2.contourArea(contours[j])
			if (area > area_min)and(area < area_max):
				# print "Area",cv2.contourArea(contours[i])
				F.append(contours[j])
		
		cv2.drawContours(gray, F, -1, (0,255,0), 3)
		cv2.imshow("gray",gray )
		str_b = str(B)
		str_c = str(C)
		while (len(str_b) < 6):
			str_b = '\0' + str_b
		while (len(str_c) < 6):
			str_c = '\0' + str_c
		DATA = str(A) + str_b + str_c + str(D) +'\n'
		# time.sleep(1)
		pyserial_test.write(DATA)
		if cv2.waitKey(1) & 0xFF == ord('q'):
			break
	cap.release()
	cv2.destroyAllWindows()
######################################################################################


###########函数入口###################################################################
if __name__=='__main__':
	t = Timer(time_interval,frame_rate)
	t.start()
	try:
		main()
	except KeyboardInterrupt:
		if pyserial_test!=None:
			pyserial_test.close()


主要想法是树莓派捕捉到摄像头每一帧图像,然后灰度化,得到图像gray,然后将gray图像作为参数传递给canny函数,canny函数主要是检测物体轮廓,得到canny图像,再将canny图像(二值化)传递给找轮廓函数,findContours返回参数有两个,其中counters是一个列表,里面存放了每一个轮廓信息,然后遍历每一个轮廓信息,对其求面积,面积满足一定要求时,将counters列表元素append到F列表中,这样F列表中每一个元素就是满足面积要求的轮廓信息
 
  

猜你喜欢

转载自blog.csdn.net/qq_33894122/article/details/77938681