








Preview text:
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.       
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 
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  import time 
arduino = serial.Serial(port='COM3', baudrate=115200, 
timeout=0.1) while True: 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);   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ở.       
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)  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 
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.       
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 
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  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'):   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.   
TÀI LIỆU THAM KHẢO 
[1] MATLAB | RGB image representation. 
https://www.geeksforgeeks.org/matlab-rgb-image-representation/