博主最近参加一个比赛,需要识别白色纸片上的黑色胶带,由于单片机跑不了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列表中每一个元素就是满足面积要求的轮廓信息