-
-
-
Tổng tiền thanh toán:
-
Sử dụng Camera phân loại sản phẩm theo mầu sắc
10/04/2026
Sử dụng Camera phân loại sản phẩm theo mầu sắc
Cấu trúc điều khiển
Camera ==> Máy tính ==> Pycharm ==> Arduino ==> Servo
Nếu dùng PLC:
Camera ==> Máy tính ==> Pycharm ==> Arduino ==> Relay ==> PLC ==> van Xilanh
Có thể thêm Cảm biến hồng ngoại ==> arduino ==> relay ==> động cơ băng chuyền
1. Code Pycharm đọc hình ảnh:
import cv2
import numpy as np
import serial
import time
# ================= SERIAL =================
# đổi COM cho đúng máy bạn
ser = serial.Serial('COM6', 9600, timeout=1) #chú ý thay đổi chân kết nối, baud giống với arduino
time.sleep(2)
# ================= CAMERA =================
cap = cv2.VideoCapture(0)
cap.set(3,640)
cap.set(4,480)
# ================= NGƯỠNG MÀU HSV =================
# Đỏ (2 dải)
lower_red1 = np.array([0,120,70])
upper_red1 = np.array([10,255,255])
lower_red2 = np.array([170,120,70])
upper_red2 = np.array([180,255,255])
# Xanh (cà chua xanh)
lower_green = np.array([35,80,80])
upper_green = np.array([85,255,255])
# Vàng (cà chua chín vàng)
lower_yellow = np.array([20,100,100])
upper_yellow = np.array([35,255,255])
# ================= HÀM GỬI SERIAL =================
last_sent = ""
def send_serial(text):
global last_sent
if text != last_sent:
ser.write((text+"\n").encode())
print("Send:", text)
last_sent = text
# ================= VÒNG LẶP CHÍNH =================
while True:
ret, frame = cap.read()
if not ret:
break
# Làm mờ để giảm nhiễu
blur = cv2.GaussianBlur(frame,(11,11),0)
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
# ===== TẠO MASK MÀU =====
mask_red1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask_red2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask_red = mask_red1 + mask_red2
mask_green = cv2.inRange(hsv, lower_green, upper_green)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)
# ===== ĐẾM DIỆN TÍCH =====
red_area = cv2.countNonZero(mask_red)
green_area = cv2.countNonZero(mask_green)
yellow_area = cv2.countNonZero(mask_yellow)
threshold = 5000 # chỉnh nếu cần
result = "NONE"
if red_area > green_area and red_area > yellow_area and red_area > threshold:
result = "RED"
cv2.putText(frame,"CA CHUA DO",(10,40),0,1,(0,0,255),3)
elif green_area > red_area and green_area > yellow_area and green_area > threshold:
result = "GREEN"
cv2.putText(frame,"CA CHUA XANH",(10,40),0,1,(0,255,0),3)
elif yellow_area > red_area and yellow_area > green_area and yellow_area > threshold:
result = "YELLOW"
cv2.putText(frame,"CA CHUA VANG",(10,40),0,1,(0,255,255),3)
else:
cv2.putText(frame,"KHONG NHAN DIEN",(10,40),0,1,(255,255,255),2)
# ===== GỬI SERIAL =====
send_serial(result)
# ===== HIỂN THỊ =====
cv2.imshow("Tomato Detector", frame)
cv2.imshow("Mask Red", mask_red)
cv2.imshow("Mask Green", mask_green)
cv2.imshow("Mask Yellow", mask_yellow)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
ser.close()
2. Code arduino điều khiển relay:
// ===== CHAN OUTPUT =====
#define PIN_DO 11
#define PIN_XANH 12
#define PIN_VANG 10
String data = "";
void setup() {
Serial.begin(9600);
pinMode(PIN_DO, OUTPUT);
pinMode(PIN_XANH, OUTPUT);
pinMode(PIN_VANG, OUTPUT);
// mặc định HIGH
digitalWrite(PIN_DO, HIGH);
digitalWrite(PIN_XANH, HIGH);
digitalWrite(PIN_VANG, HIGH);
}
void tatHet(){
digitalWrite(PIN_DO, HIGH);
digitalWrite(PIN_XANH, HIGH);
digitalWrite(PIN_VANG, HIGH);
}
void loop() {
if (Serial.available()) {
data = Serial.readStringUntil('\n');
data.trim();
tatHet(); // reset trước
if (data == "RED") {
digitalWrite(PIN_DO, LOW);
}
else if (data == "GREEN") {
digitalWrite(PIN_XANH, LOW);
}
else if (data == "YELLOW") {
digitalWrite(PIN_VANG, LOW);
}
else if (data == "NONE") {
tatHet();
}
}
}
3. Cài đặt thư viện PyCharm
pip install numpy opencv-python matplotlib
pip install opencv-python numpy pyserial