You are on page 1of 12

Lê Thanh Phúc

Bài 1: MỞ ĐẦU PYTHON


1. Python Shell
Python Shell là một chương trình dùng để soạn thảo các tập lệnh và tạo file *.py cơ
bản. Ngoài ra, Python Shell có thể thực thi các chương trình viết bằng ngôn ngữ
Python. Download chương trình Python Shell trên trang của Python:
https://www.python.org/downloads/
Sau khi cài đặt, khởi động Python Shell cho ta cửa sổ như sau:

Thực hiện File >> New File, ta sẽ có cửa sổ sau:

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

Bài 2: SERIAL COMMUNICATION GIỮA LAPTOP VÀ ARDUINO


SỬ DỤNG PYTHON
1. Cài đặt Package Serial Communication cho Python IDE
Việc kết nối laptop và Arduino nhằm mục đích vận dụng khả năng tính toán mạnh
của laptop và khả năng điều khiển thiết bị của Arduino. Chúng ta có thể tiến hành
chương trình tính toán phức tạp trên laptop như việc xử lý ảnh và thuật toán
điều khiển. Tín hiệu từ laptop sẽ truyền xuống Arduino để thực thi các lệnh.
Để thêm Package Serial Communication, từ Command Prompt của Window
chúng ta gõ lệnh:
py -m pip install pyserial

2. Code Python Shell


import serial (thêm thư viên serial)
import time
arduino = serial.Serial(port='COM3', baudrate=115200,
timeout=0.1) (Mở cổng kết nối với arduino)
while True: ( Tạo vòng lập đến khi kết nối được với
arduino
data = arduino.readline()
time.sleep(0.01)
arduino.write(data)
time.sleep(0.01)
data1= data.decode('utf-8')
print(data1)

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

Bài 3: XỬ LÝ ẢNH BẰNG PYTHON


1. Giới thiệu
Thu thập và xử lý ảnh là nhiệm vụ rất quan trọng trong việc thực hiện tự động lái
trên ô tô. Trong bài này, nội dung là trình bày các chức năng cơ bản của Python
trong việc xử lý ảnh.
Giống như các công cụ khác, để xử lý ảnh, chúng ta cũng phải thêm Package xử lý
ảnh cho Python. Mở cửa sổ Command Prompt, gõ lệnh sau để cài đặt Pillow
Package.
py -m pip install Pillow

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)

arduino = serial.Serial(port='COM3', baudrate=115200,


timeout=0.1)

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

Bài 4: XỬ LÝ ẢNH BẰNG OPEN CV TRONG PYTHON


1. Giới thiệu
Open CV là thư viện các hàm chương trình xử lý ảnh như biến đổi, phân tích,
nhận dạng hình ảnh. Trong Python Shell, chúng ta cài đặt gói opencv-python
như giới thiệu trong Bài 3 để có thể bắt đầu sử dụng.
Trong bài này, đầu tiên chúng ta lưu ý một số lệnh quan trọng trong Open CV.
Sau đó, chúng ta dùng Open CV để nhận diện đoạn thẳng. Việc nhận diện đoạn
thẳng là việc quan trọng để xác định làn đường di chuyển của ô tô.
2. Một số lệnh trong Open CV
Một tấm ảnh gồm nhiều điểm ảnh ghép lại mà ta gọi là các pixel. Một ảnh đen
trắng, mỗi pixel có giá trị từ 0 – 255, thể hiện độ sáng của pixel đó. Giá trị 0 là
hoàn toàn đen. Giá trị 255 là hoàn toàn trắng. Một ảnh màu, mỗi pixel là sự phối
hợp giữa 3 màu Red – Green – Blue (RGB). Trong Open CV, thứ tự màu quy định
ngược lại là BGR. Như vậy, mỗi pixel màu có một bộ giá trị BGR. Ví dụ mỗi điểm
trong hình màu xanh ngọc bích sau có bộ giá trị (255, 255, 125). Hình sau có kích
thước 300 x 300, nó có 90.000 điểm như vậy.

Hình 1. Hình màu xanh ngọc bích


Các phần mềm xử lý ảnh đối xử 1 tấm ảnh như là 1 ma trận các pixel. Nếu xem
tấm ảnh trên là 1 ma trận 2 chiều thì các pixel đang xếp theo hàng và cột. Chúng

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.

Hình 2. Ma trận 3 chiều biểu diễn 1 ảnh [1]


- Import Open CV vào Python ban đầu:
import cv2
- Đọc và hiển thị 1 ảnh:
img = cv2.imread(‘Ten_anh.jpg')
Ten = "Hinh load"
cv2.imshow(Ten, img)
- Xem thông tin ảnh:
print(img.shape)
print(img.size)
print(img.dtype)
- Truy cập từng lớp B, G, R:
blue = img[:,:,0]
green = img[:,:,1]
red = img[:,:,2]
Hoặc:
b,g,r = cv2.split(img)
- Truy cập và gán giá trị từng pixel:
red_10_10 = img[10,10,2]
img[10,10,2] = 255

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)

3. Code Python nhận diện đoạn thẳng


import cv2
import numpy as np

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

TÀI LIỆU THAM KHẢO


[1] MATLAB | RGB image representation.
https://www.geeksforgeeks.org/matlab-rgb-image-representation/

12

You might also like