ĐATN này là tâm huyết của mình trong 4 năm đại học, nó đã giúp mình đạt điểm 9. File này mình đã ghi chi tiết đầy đủ cách đấu nối, lắp ráp và code. các bạn tải về và làm theo thôi nhé. Chúc các bạn thành công.
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… Hồ Chí Minh, ngày… tháng… năm 2021 Giảng viên hướng dẫn -i- NHẬN XÉT CỦA GIẢNG VIÊN PHẢN BIỆN …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… …………………………………………………………………………………… Hồ Chí Minh, ngày… tháng… năm 2021 Giảng viên hướng dẫn - ii - LỜI CẢM ƠN Để hồn thành khóa luận này, em xin gửi lời cảm ơn đến thầy Ngơ Hồng Ấn đồng hành em suốt quãng thời gian dài để ngày hơm em viết nên lời đẹp đẽ này! Cảm ơn Thầy hỗ trợ em nhiệt tình, thầy tận tâm dạy thứ em chưa hiểu Thầy đưa góp ý chân thành không ngần ngại cho em mượn đồ để em hồn thành đề tài cách chỉnh chu tốt Em trân quý hỗ trợ từ thầy! Em xin cảm ơn quý Thầy Cô Trường Đại học công nghiệp thực phẩm thành phố Hồ Chí Minh, người em viết nên câu chuyện năm tháng đại học Giờ nhìn lại chặng đường thức đêm để ôn thi, khẩn trương để làm tập lớn cho kịp deadline lần vội ăn sáng để đến kịp trường thầy trưởng thành nhiêu! Xin cảm ơn người bạn sát cánh, bên cạnh, trải qua niềm vui khó khăn suốt q trình học tập! Những chia sẻ, đóng góp người ln học vô quý giá Thành công đề tài đóng góp người suốt q trình hồn thành! Một lần em xin gửi lời cảm ơn đến quý thầy cô, bạn bè ba mẹ Cảm xúc em nguyên vẹn sau ngần năm Xin chân thành cảm ơn! Người thực đề tài Nguyễn Văn Nam - iii - TÓM TẮT KHÓA LUẬN Đề tài “Ứng dụng xử lý ảnh phân loại cà chua theo màu sắc kích thước” xây dựng thành mơ hình có khả phân loại cà chua theo màu sắc kích thước cài đặt trước Sử dụng ngơn ngữ lập trình Python với thư viện OpenCV để xử lý ảnh chụp cà chua đưa kết luận màu sắc kích thước thực hoàn toàn kit Raspberry Pi 3B+ Ngồi ra, hệ thống cịn giám sát máy tính thơng qua ứng dụng VNC Viewer Kết đạt mơ hình có khả phân loại cà chua thành bốn loại khác tùy vào thơng số màu sắc kích thước cài đặt trước, giám sát số lượng loại thông qua ứng dụng - iv - LỜI MỞ ĐẦU Trong năm học vừa qua, chúng em học nhiều môn học điện, điện tử Và khóa luận tốt nghiệp lần dịp để tổng hợp lại mơn học Sau thời gian nghiên cứu tính thực tiễn em lựa chọn mơ hình phân loại sản phẩm phân loại cà chua theo màu kích thước để làm đề tài cho khóa luận tốt nghiệp Thơng qua khóa luận em tích lũy, tổng hợp phát huy nhiều kiến thức ngành Điện - điện tử học thời gian qua Là sinh viên chuyên ngành Điện Tử em trang bị kiến thức chuyên nghành điện tử kiến thức khác điều khiển hệ thống điều khiển Vì khóa luận lớn cuối khóa học, tổng hợp đầy đủ kiến thức nhiều môn học nên em cịn gặp phải nhiều khó khăn tài liệu kinh nghiệm cho trình thực Tuy nhiên trình thực nhờ động viên giúp đỡ tạo điều kiện khoa hướng dẫn tận tình thầy Hồng Quang Anh bạn sinh viên khác giúp em hoàn thành đề tài này! Chúng em xin cảm ơn thầy giáo môn thầy giáo hướng dẫn tận tình giúp đỡ em thời gian qua Em xin chân thành cảm ơn -v- MỤC LỤC CHƯƠNG MỞ ĐẦU 1.1 Đặt vấn đề 1.2 Mục tiêu đề tài 1.3 Phạm vi nghiên cứu CHƯƠNG CƠ SỞ LÝ THUYẾT .3 2.1 Xứ lý ảnh, vấn đề xử lý ảnh 2.1.1 Khái niệm sử lý ảnh 2.1.2 Các vấn đề xử lý ảnh 2.2 Phương pháp phát biên nhận dạng màu sắc 2.2.1 Phương pháp phát biên vật thể .7 2.2.2 Phương pháp nhận dạng màu sắc .10 2.3 Giới thiệu ngôn ngữ lập trình Python thư viện OpenCV 15 2.3.1 Ngơn ngữ lập trình Python .15 2.3.2 Thư viện OpenCV 16 2.4 Giới thiệu phần mềm VNC viewer 17 2.4.1 Nguyên lý hoạt động phần mềm VNC 17 2.4.2 Ưu nhược điểm phần mềm VNV viewer 18 2.5 Giới thiệu phần cứng 19 - vi - 2.5.1 Raspberry Pi Model B+ 19 2.5.2 Camera Wedcam Dahua Z3 .24 2.5.3 Băng tải 26 2.5.4 Động 12V 26 2.5.5 Cảm biến vật cản hồng ngoại E18-D80NK 27 2.5.6 Động servo SG90 29 2.5.7 Adapter .29 2.5.8 Module giảm áp LM2596 31 CHƯƠNG THIẾT KẾ VÀ THI CÔNG MƠ HÌNH 32 3.1 Sơ đồ kết nối phần cứng 32 3.2 Thiết kế giao diện phần mềm 33 3.2.1 Chọn vi xử lý 33 3.2.2 Lập trình giao diện web 34 3.2.3 Giao diện người dùng .35 3.3 Lưu đồ giải thuật .36 3.3.1 Lưu đồ phần xử lý hình ảnh .36 3.3.2 Lưu đồ phân loại cà chua 37 3.3.3 Lưu đồ giải thuật toàn hệ thống 38 3.4 Thi cơng mơ hình 41 - vii - CHƯƠNG KẾT QUẢ VÀ NHẬN XÉT 43 4.1 Kết nối chạy mơ hình 43 4.2 Kết thi cơng thử nghiệm mơ hình 44 4.2.1 Kết đạt 44 4.2.2 Thử nghiệm mơ hình phân loại cà chua 44 4.3 Nhận xét kết 46 CHƯƠNG TỔNG KẾT VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI .47 5.1 Tổng kết 47 5.2 Hướng phát triển đề tài 47 - viii - MỤC LỤC HÌNH ẢNH Hình 2.1 Q trình xử lý ảnh .3 Hình 2.2 Các bước hệ thống xử lý ảnh Hình 2.3 Non-maximum Suppression Hình 2.4 Lọc ngưỡng .10 Hình 2.5 Khơng gian màu RGB 10 Hình 2.6 Khơng gian màu CMYK 11 Hình 2.7 Khơng gian màu HSV 12 Hình 2.8 Khơng gian màu CIE LAB 13 Hình 2.9 Dải màu H-S Error! Bookmark not defined Hình 2.10 Thơng sơ màu H hệ HSV 14 Hình 2.11 Giao diện ứng dụng VNC Viewer 18 Hình 2.12 Sơ đồ Raspberry Pi .20 Hình 2.13 Sơ đồ chân Raspberry Pi 22 Hình 2.14 Wedcam dahua z3 25 Hình 2.15 Băng tải mini 26 Hình 2.16 Động 12V 27 Hình 2.17 Cảm biến vật cản hồng ngoại E18-D80NK 27 Hình 2.18 Sơ đồ chân cảm biến .28 - ix - Hình 2.19 Động servo SG90 29 Hình 2.20 Adapter 5V cho Raspberyy Pi 30 Hình 2.21 Adapter 12V .30 Hình 2.22 Mạch giảm áp LM2596 31 Hình 3.7 Sơ đồ kết nối toàn hệ thống 32 Hình 3.1 Sơ đồ kết nối Raspberry Pi 34 Hình 3.2 Giao diện web .34 Hình 3.3 Giao diện với người dùng 36 Hình 3.4 Lưu đồ chụp ảnh 37 Hình 3.5 Lưu đồ phân loại cà chua 38 Hình 3.6 Lưu đồ giải thuật toàn hệ thống 40 Hình 3.8 Lắp rắp phần băng tải 41 Hình 3.9 Lắp ráp phần camera 41 Hình 3.10 Lắp ráp phần phân loại .42 Hình 3.11 Mơ hình hồn chỉnh 42 Hình 4.1 Giao diện chạy chương trình 45 -x- def close_window(): tk.destroy() # chuong trinh xu ly vien de nhan kich thuoc cua vat def edge_processing(image_e): image_edge=image_e[0:730,70:950] img_gr=cv2.cvtColor(image_edge,cv2.COLOR_BGR2GRAY); img_remove_noise=cv2.GaussianBlur(img_gr,(5,5),0); #_,img_2=cv2.threshold(img_remove_noise,20,255,cv2.THRESH_BINARY) img_canny=cv2.Canny(img_remove_noise,5,30); kernel= np.ones((9,9),np.uint8) img_bien=cv2.dilate(img_canny,kernel,iterations=1) #lamdaybien _,contours,_= cv2.findContours(img_bien,cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) #cv2.imwrite('img_bien.jpg',img_bien) contours=sorted(contours,key=cv2.contourArea,reverse=True)[:2] contour=contours[1] #c=max(contours,key=cv2.contourArea) #contour=max(contours,key=cv2.contourArea) cv2.drawContours(image_edge,contour,-1,255,3) - 54 - cv2.imwrite('edge.jpg',image_edge) S=cv2.contourArea(contour) return contour,S # chuong trinh xu ly mau sac cua vat def color_processing(image_c): color='none' hsv_img=cv2.cvtColor(image_c,cv2.COLOR_BGR2HSV) ####cac gia tri mau sac### lower_red=np.array([160,100,20]) upper_red=np.array([180,255,255]) lower_orange=np.array([0,60,20]) upper_orange=np.array([32,255,255]) lower_green=np.array([35,30,20]) upper_green=np.array([70,255,255]) mask_red=cv2.inRange(hsv_img,lower_red,upper_red) mask_orange=cv2.inRange(hsv_img,lower_orange,upper_orange) mask_green=cv2.inRange(hsv_img,lower_green,upper_green) ###lam day mang mau## kernel= np.ones((5,5),np.uint8) - 55 - mask_red=cv2.dilate(mask_red,kernel,iterations=1) mask_orange=cv2.dilate(mask_orange,kernel,iterations=1) mask_green=cv2.dilate(mask_green,kernel,iterations=1) img_red=cv2.bitwise_and(image_c,image_c,mask=mask_red) img_orange=cv2.bitwise_and(image_c,image_c,mask=mask_orange) img_green=cv2.bitwise_and(image_c,image_c,mask=mask_green) ####tinh so luong pixel moi mau amount_red=cv2.countNonZero(mask_red) amount_orange=cv2.countNonZero(mask_orange) amount_green=cv2.countNonZero(mask_green) amount_3colors=amount_red+amount_orange+amount_green+1 p_red=amount_red/amount_3colors p_orange=amount_orange/amount_3colors p_green=amount_green/amount_3colors print('p_red: ',p_red) print('p_orange: ',p_orange) print('p_red: ',p_green) # sua p de dinh nghia mau sac can phan loai if p_red>0.7: - 56 - color='red' elif p_orange>0.2: color='orange' elif p_green>0.6: color='green' return color,img_red,img_orange,img_green # chuong trinh phan loai vat def control_servo(tomato_type): if tomato_type=='Type_1': sensor_number= sensor_1 servo_number=servo_1 sensor_state=not pi.read(sensor_number) print('Waiting for tomato to reach position ') while not sensor_state: sensor_state=not pi.read(sensor_number) pi.set_servo_pulsewidth(servo_number, 1000) time.sleep(0.5) pi.set_servo_pulsewidth(servo_number, 2000) time.sleep(0.5) - 57 - pi.set_servo_pulsewidth(servo_number, 1000) time.sleep(0.5) print('clasify finish') if tomato_type=='Type_2': sensor_number= sensor_2 servo_number=servo_2 sensor_state=not pi.read(sensor_number) print('Waiting for tomato to reach position ') while not sensor_state: sensor_state=not pi.read(sensor_number) pi.set_servo_pulsewidth(servo_number, 1000) time.sleep(0.5) pi.set_servo_pulsewidth(servo_number, 2000) time.sleep(0.5) pi.set_servo_pulsewidth(servo_number, 1000) time.sleep(0.5) print('clasify finish') if tomato_type=='Type_3': - 58 - sensor_number= sensor_3 servo_number=servo_3 sensor_state=not pi.read(sensor_number) print('Waiting for tomato to reach position ') while not sensor_state: sensor_state=not pi.read(sensor_number) pi.set_servo_pulsewidth(servo_number, 1000) time.sleep(0.5) pi.set_servo_pulsewidth(servo_number, 2000) time.sleep(0.5) pi.set_servo_pulsewidth(servo_number, 1000) time.sleep(0.5) print('clasify finish') temp=0 while capture.isOpened(): ret, image_ori = capture.read() state=not pi.read(sensor_cam) tk.update() print(state) - 59 - if (state==1) and (temp==0): #ham xu ly kich thuoc contour,S=edge_processing(image_ori) S=S/1000 print('S:',S) #ham xu ly mau color,red,orange,green=color_processing(image_ori) #luu anh de xuat giao dien cv2.imwrite('green.jpg',green) cv2.imwrite('orange.jpg',orange) cv2.imwrite('red.jpg',red) # xuat anh nhan duoc giao dien imagelg=Image.open('red.jpg') imagelg=imagelg.resize((210,150),Image.ANTIALIAS) imagelg=ImageTk.PhotoImage(imagelg) lb03=Label(image=imagelg) lb03.image=imagelg lb03.pack() lb03.place(x=5,y=110) - 60 - tk.update() imagelg=Image.open('orange.jpg') imagelg=imagelg.resize((210,150),Image.ANTIALIAS) imagelg=ImageTk.PhotoImage(imagelg) lb04=Label(image=imagelg) lb04.image=imagelg lb04.pack() lb04.place(x=250,y=110) tk.update() imagelg=Image.open('green.jpg') imagelg=imagelg.resize((210,150),Image.ANTIALIAS) imagelg=ImageTk.PhotoImage(imagelg) lb05=Label(image=imagelg) lb05.image=imagelg lb05.pack() lb05.place(x=490,y=110) tk.update() if color=='red': red_tc=1; orange_tc=0 ; green_tc=0 - 61 - elif color=='orange': red_tc=0 ; orange_tc=1 ; green_tc=0 else: red_tc=0 ;orange_tc=0 ;green_tc=1 print(red_tc,orange_tc,green_tc) time.sleep(0.03) if S