Professional Documents
Culture Documents
Chúng ta sẽ biên soạn file, chạy file trên giao diện này.
2. Cài đặt các Package cho Python Shell
Package là các gói chương trình để thêm vào Python Shell để nó có thể thực hiện
được nhiều lệnh và chức năng. Ví dụ như Giao tiếp với thiết bị bên ngoài, xử lý ảnh,
hàm toán học, …
Việc cài đặt các Package được thực hiện trong cửa sổ Command Prompt của
Window. Để mở cửa sổ này, ta có thể Search trên công cụ tìm kiếm của Window.
1
Lê Thanh Phúc
Kiểm tra phiên bản Python cài trên máy bằng lệnh:
py --version
Python sử dụng công cụ pip để cài đặt các Package mới như: Giao tiếp nối tiếp, Xử
lý ảnh, … Dùng lệnh sau để cài đặt:
py -m pip install "SomeProject"
"SomeProject" là tên của Package. Ví dụ: pyserial, opencv-python
2
Lê Thanh Phúc
3. Code Arduino
Chương trình này đọc tín hiệu analog từ 1 biến trở ở chân A0, truyền tín hiệu này
lên Python và đọc tín hiệu truyền ngược từ laptop xuống chính tín hiệu analog
này. Arduino sẽ cho dèn LED chân 11 sáng tỏ hay mờ dựa vào giá trị analog.
int x;
void setup() {
Serial.begin(115200);
Serial.setTimeout(1);
pinMode(11,OUTPUT);
}
void loop() {
int sensorValue = analogRead(A0);
3
Lê Thanh Phúc
Serial.print(sensorValue);
Serial.print('\n');
x = Serial.readString().toInt();
int y=int(x/4);
analogWrite(11,y);
delay(100);
}
Nạp chương trình vào Arduino, kết nối Arduino với laptop qua cổng USB, chạy
chương trình Python, ta sẽ thấy LED nối với chân 11 của Arduino sẽ sáng với độ
sáng thay đổi theo giá trị xoay của biến trở.
4
Lê Thanh Phúc
Trong cửa sổ Command Prompt, gõ lệnh sau để cài đặt OpenCV Package.
py -m pip install opencv-python
2. Code Python
import cv2
from PIL import Image
from PIL.ImageStat import Stat
import serial
import time
cam = cv2.VideoCapture(0)
frame = cam.read()[1]
cv2.imwrite('img2.png', frame)
Hinh1 = Image.open("img2.png")
Hinh1.show()
hinh2 = Image.Image.split(Hinh1)
print(Hinh1.mode)
ThongKe = Stat(Hinh1)
print(ThongKe.mean)
MauDo=ThongKe.mean[0]
XanhLuc=ThongKe.mean[1]
XanhDuong=ThongKe.mean[2]
DanhSach=[MauDo, XanhLuc, XanhDuong]
max_DanhSach=max(DanhSach)
max_index = DanhSach.index(max_DanhSach)
5
Lê Thanh Phúc
dem=0
while (dem<10):
dem=dem+1
if max_index==0:
print('Mau Do')
arduino.write(b'1')
time.sleep(0.1)
if max_index==1:
print('Xanh Luc')
arduino.write(b'2')
time.sleep(0.1)
if max_index==2:
print('Xanh Duong')
arduino.write(b'3')
time.sleep(0.1)
arduino.close()
cam.release()
3. Code Arduino
int x;
void setup() {
Serial.begin(115200);
Serial.setTimeout(1);
pinMode(11,OUTPUT);
}
void loop() {
x = Serial.readString().toInt();
if (x==1){
analogWrite(11,250);
}
if (x==2) {
analogWrite(11,10);
}
if (x==3) {
analogWrite(11,0);
}
delay(100);
}
Chuẩn bị 3 hình nền với 3 màu: Đỏ, Xanh lá cây và Xanh dương. Lần lượt đưa 3
hình này vào camera của máy tính. Chương trình Python sẽ xác định được màu và
truyền kết quả này đến Arduino qua giao tiếp nối tiếp. LED nối với chân 11 của
6
Lê Thanh Phúc
Arduino sẽ có 3 trạng thái: 1) Sáng nhất khi có màu Đỏ; 2) Sáng mờ khi có màu
Xanh lá cây; 3) Tắt khi có màu Xanh dương.
7
Lê Thanh Phúc
8
Lê Thanh Phúc
ta có ma trận 300 x 300. Mỗi pixel được định vị bằng các chỉ số hàng và cột. Thêm
vào đó, mỗi pixel lại có một bộ giá trị BGR đi kèm. Vì vậy, biểu diễn đầy đủ 1 tấm
ảnh là 1 ma trận 3 chiều như hình sau.
9
Lê Thanh Phúc
Hoặc:
red_10_10 = img.item(10,10,2)
img.itemset((10,10,2),255)
- Lựa chọn khu vực quan tâm (ROI – Region of Interest) và gán giá trị cho cả
vùng:
ROI_anh = img[130:280, 250:350]
img[100:200, 300:400] = 255
- Vẽ một số hình cơ bản trực tiếp lên ảnh:
img = cv2.rectangle(img, start_point, end_point, color,
thickness)
img = cv2.circle(img, center_coordinates, radius, color,
thickness)
- Biến đổi ảnh màu sang đen trắng (ảnh xám) và nhị phân:
anh_Xam = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(thresh, anh_NhiPhan) = cv2.threshold(anh_Xam, 127, 255,
cv2.THRESH_BINARY)
cam = cv2.VideoCapture(0)
window_name = 'Hinh anh tu Camera'
while(True):
Hinh1 = cam.read()[1]
gray = cv2.cvtColor(Hinh1, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, rho=1, theta=np.pi/180,
threshold=100)
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
cv2.line(Hinh1,(x1,y1),(x2,y2),(255,255,125),2)
cv2.imshow(window_name,Hinh1)
if cv2.waitKey(1) & 0xFF == ord('q'):
10
Lê Thanh Phúc
break
cam.release()
cv2.destroyAllWindows()
4. Kết quả
Để nhận diện đoạn thẳng, ta dùng phép biến đổi Hough bằng lệnh
cv2.HoughLines(). Để thực hiện được lệnh này, chúng ta phải biến đổi hình
ảnh sang dạng đen trắng và phát hiện cạnh bằng các lệnh cv2.cvtColor() và
cv2.Canny() tương ứng. Vòng lặp for trong code trên dùng để vẽ các đoạn
thẳng đã nhận diện được trên hình.
Chạy chương trình, thu được hình ảnh như sau.
11
Lê Thanh Phúc
12