树莓派搭建图像识别基站

来源:互联网 发布:机械工艺设计软件 编辑:程序博客网 时间:2024/05/21 10:54
博主最近参加一个比赛,需要识别白色纸片上的黑色胶带,由于单片机跑不了opencv等一些高级算法,于是就想到了用树莓派 + python 跑opencv,实际测试效果还挺好
下面贴代码
#coding=utf_8import multiprocessingfrom threading import Timerimport numpy as npimport cv2import timei = 0time_interval = 1.0lower_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 ix = iprint xi = 0t = 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 ii = i + 1X = []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_bwhile (len(str_c) < 6):str_c = '\0' + str_cDATA = str(A) + str_b + str_c + str(D) +'\n'# time.sleep(1)pyserial_test.write(DATA)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.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列表中每一个元素就是满足面积要求的轮廓信息