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