You are on page 1of 11

BỘ CÔNG THƯƠNG

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP. HỒ CHÍ MINH


KHOA ĐIỆN TỬ
--------

BÁO CÁO THỰC HÀNH

Môn Học : thực hành xử lí ảnh

Giảng viên hướng dẫn : Phan Vinh Hiếu

Sinh viên thực hiện :


Nguyễn Hữu Sang MSSV 21045411
Nguyễn Thanh Phương MSSV 21033061
Nguyễn Quốc CHương MSSV 21024291

TP.HCM, ngày 4 tháng 4 năm 2024

Code cutvideo.py
import cv2
def FrameCapture(Path):
vidObj = cv2.VideoCapture(Path)
count = 0
success = 1
while success:
success, image = vidObj.read()
if count % 10 == 0:
cv2.imwrite("dataset\\frame%d.jpg"%(count/10),image)
count+=1
print("0")
#if __name__ == '__name__':
FrameCapture("D:\XLA\YOLO\WIN_20240229_16_03_15_Pro.mp4")
print("1")
1. Thư viện
khai báo thư viện cv2 trong OpenCV
import cv2
# khởi tạo hàm FrameCapture nhận đường dẫn video theo Path
def FrameCapture(Path):
# gán cv2.VideoCapture đường dẫn Path vào vidObj
vidObj = cv2.VideoCapture(Path)
#đếm số khung hình trích xuất
count = 0
#biến kiểm tra việc đọc và mở video thành công hay ko
success = 1
2. Vòng lặp chạy nhận diện và hiển thị
# vòng lặp while sẽ thực thi success khi không còn khung hình để đọc
while success:
success, image = vidObj.read()
if count % 10 == 0:
cv2.imwrite("dataset\\frame%d.jpg"%(count/10),image)
count+=1
# vidObj.read() sẽ đọc khung hình từ video và gán nó vào biến image và cập nhật giá trị
của success cho biết việc đọc thành công hay không
# vòng lặp if nếu sau mỗi 10 khung hình thì sẽ lưu ảnh
# hàm cv2.imwrite dùng để lưu ảnh với tên file theo .jpg vào thư mục dataset và đánh số
thứ tự hình ảnh
# biến count+=1 sau mỗi lần lặp thì count sẽ tăng lên 1 đếm số khung hình đã xử lý
3. Gọi hàm và in thông báo
print("0")
#if __name__ == '__name__':
FrameCapture("D:\XLA\YOLO\WIN_20240229_16_03_15_Pro.mp4")
print("1")

print("0")
print in giá trị 0
FrameCapture("D:\XLA\YOLO\WIN_20240229_16_03_15_Pro.mp4")
# hàm FrameCapture gọi đường dẫn video
print("1")
# print giá tri 1 khi hàm FrameCapture hoàn thành

Code my_train.py
# Train du lieu anh
from ultralytics import YOLO
# Load a model
model = YOLO('yolov8n.yaml') # build a new model from YAML
model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
goc:yolov8n.pt
if __name__ == '__main__': # can khi chay bang GPU
model.train(data='D:\\XLA\\YOLO\\dataset.yaml', epochs=30, imgsz=640, batch=16,
optimizer='Adam')
metrics = model.val()
4. Nhập thư viện
#khai báo thư viện ultralytics vào lớp YOLO
from ultralytics import YOLO
5. Load mô hình YOLO
# Load a model
model = YOLO('yolov8n.yaml') # build a new model from YAML
model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
goc:yolov8n.pt
# tạo mô hình YOLO mới từ tệp .yaml được cung cấp
# tải mô hình YOLO đã được huấn luyện từ tệp .pt
6. Huấn luyện mô hình
if __name__ == '__main__': # can khi chay bang GPU
model.train(data='D:\\XLA\\YOLO\\dataset.yaml', epochs=30, imgsz=640, batch=16,
optimizer='Adam')
metrics = model.val()
# hàm model.train bắt đầu quá trình huấn luyện với data theo tệp .yaml
# epchs số lần lặp lại toàn bộ dữ lieu
# imgsz kích thước đầu vào là 640x640 pixel
# batch số lượng ảnh sử dụng qua mỗi lần cập nhật trọng số
# optimizer thuật toán tối ưu hóa
# hàm model.val() đánh giá mô hình theo tập dữ liệu trong thư mục val
Giải thích code “detect.py”.
import cv2
from ultralytics import YOLO

model = YOLO(r'E:\Dai_Hoc\XuLyAnh-TH\YoLo\runs\detect\train3\weights\best.pt')
vid = cv2.VideoCapture(0)
vid = cv2.VideoCapture('G:/Hk_1_nam_4/thi_giac_may_tinh/YOLO8/test1.mp4')

while (True):
ret, frame = vid.read()
frame = cv2.flip(frame, 1) #mirror
results = model(frame)
annotated_image = results[0].plot() #

cv2.imshow("YOLOv8 Inference", annotated_image)


if cv2.waitKey(1) & 0xFF == ord('q'):
break

vid.release()
cv2.destroyAllWindows()
1.Nhập thư viện:
import cv2
from ultralytics import YOLO
import cv2: Nhập thư viện OpenCV để thực hiện các tác vụ về thị giác máy tính như
chụp ảnh, xử lý ảnh và hiển thị ảnh.
from ultralytics import YOLO: Nhập lớp YOLO từ thư viện ultralytics cung cấp các
chức năng để tải và sử dụng mô hình YOLO để phát hiện đối tượng.
2.Tải mô hình YOLO.
model = YOLO(r'E:\Dai_Hoc\XuLyAnh-TH\YoLo\runs\detect\train3\weights\best.pt')
Tạo một thể hiện đối tượng YOLO. Tham số chỉ ra đường dẫn đến tập tin trọng số mô
hình YOLOv5 được đào tạo trước (best.pt). Tệp này chứa các tham số mô hình đã được
đào tạo cho phép phát hiện đối tượng.
3. Khởi tạo Video Capture:
vid = cv2.VideoCapture(0)
Mở webcam mặc định (chỉ mục 0) và lưu trữ thông tin vào biến vid.
Nói cách khác, nó "bật" webcam và cho phép chương trình truy cập hình ảnh từ camera.
vid = cv2.VideoCapture('G:/Hk_1_nam_4/thi_giac_may_tinh/YOLO8/test1.mp4')
Mở tập tin video có tên test1.mp4 và lưu trữ thông tin vào biến vid.
Nói cách khác, nó "mở" video và cho phép chương trình truy cập hình ảnh từ video.
4. Vòng lặp chính:
while (True):
ret, frame = vid.read()
frame = cv2.flip(frame, 1)
results = model(frame)
annotated_image = results[0].plot()

cv2.imshow("YOLOv8 Inference", annotated_image)


if cv2.waitKey(1) & 0xFF == ord('q'):
break
#Vòng lặp while liên tục chụp các khung hình từ nguồn video, thực hiện phát hiện đối
tượng, hiển thị kết quả được chú thích và xử lý đầu vào của người dùng.
ret, frame = vid.read()
Đọc một khung hình từ đối tượng video capture. ret là cờ boolean cho biết thành công
(True) hay thất bại (False) của việc đọc khung hình.
frame = cv2.flip(frame, 1)
Lật khung hình theo chiều ngang (hữu ích cho chế độ xem webcam giống ảnh tự
sướng).
results = model(frame)
Truyền khung hình cho mô hình YOLO để phát hiện đối tượng. Biến results sẽ chứa
thông tin phát hiện.
annotated_image = results[0].plot()
chọn kết quả đầu tiên từ danh sách các kết quua và chú thích các đối tượng trên khung
hình gốc bằng cách sử dụng .plot() để vẽ các hộp giới hạn và nhãn cho các đối tượng
nhận diện và kết quả sẽ được lưu vào annotated_image.
cv2.imshow("YOLOv8 Inference", annotated_image)
Hiển thị khung hình được chú thích (với các phát hiện) trong một cửa sổ có tiêu đề
"YOLOv8 Inference".
if cv2.waitKey(1) & 0xFF == ord('q'):
Kiểm tra xem người
5. Kết thúc.
vid.release()
Giải phóng tài nguyên được sử dụng bởi webcam hoặc tập tin video được liên kết với
biến vid.Nói cách khác, nó "tắt" webcam hoặc "đóng" video.
cv2.destroyAllWindows()
Đóng tất cả cửa sổ hiển thị được tạo bởi OpenCV.

Giải thích code “DetectOnJetson.py”.


import cv2
import serial
from ultralytics import YOLO
ser = serial.Serial('COM2', 9600

model = YOLO(r'E:\Dai_Hoc\XuLyAnh-TH\YoLo\runs\detect\train\weights\best.pt')
vid = cv2.VideoCapture(0)

while (True):
ret, frame = vid.read()
frame = cv2.flip(frame, 1)
results = model(frame)
annotated_image = results[0].plot()

detected_classes = {'Sang': False, 'Phuong': False, 'ChaiNuoc': False}

for r in results:
acls = r.boxes.cls
for a in acls:
cls_value = int(a.item())
if cls_value == 0:
detected_classes['Sang'] = True
elif cls_value == 1:
detected_classes['Phuong'] = True
elif cls_value == 2:
detected_classes['ChaiNuoc'] = True
ser.write(str(cls_value).encode
for cls_name, detected in detected_classes.items():
if not detected:
if cls_name == 'Sang':
ser.write(b'4')
elif cls_name == 'Phuong':
ser.write(b'5')
elif cls_name == 'ChaiNuoc':
ser.write(b'6')

cv2.imshow("YOLOv8 Inference", annotated_image)


if cv2.waitKey(1) & 0xFF == ord('q'):
break

vid.release()
cv2.destroyAllWindows()

1.Nhập thư viện.


import cv2
Nhập thư viện OpenCV để xử lý hình ảnh.
import serial
Nhập thư viện serial để giao tiếp với thiết bị qua cổng nối tiếp (COM).
from ultralytics import YOLO
Nhập lớp YOLO từ thư viện ultralytics để phát hiện đối tượng.
2.Cấu hình kết nối Seria
ser = serial.Serial('COM2', 9600)
Tạo một đối tượng serial để kết nối với cổng COM2 với tốc độ truyền 9600 baud.
3. Khởi tạo mô hình YOLO:
model = YOLO(r'E:\Dai_Hoc\XuLyAnh-TH\YoLo\runs\detect\train\weights\best.pt')
Khởi tạo mô hình YOLO được huấn luyện trước với tập tin weights best.pt.
4. Khởi tạo VideoCapture:
vid = cv2.VideoCapture(0)
Khởi tạo đối tượng VideoCapture để truy cập webcam mặc định (chỉ mục 0).
5. Vòng lặp chính:
ret, frame = vid.read()
Đọc một khung hình từ webcam và lưu trữ thông tin thành công (ret) và hình ảnh
(frame) vào các biến tương ứng.
frame = cv2.flip(frame, 1)
Lật ngược khung hình theo chiều ngang (có thể hữu ích cho chế độ xem webcam giống
ảnh tự sướng).
results = model(frame)
Chạy mô hình YOLO trên khung hình frame để phát hiện đối tượng. Biến results sẽ
chứa thông tin về các đối tượng được phát hiện.
annotated_image = results[0].plot()
Vẽ các hộp giới hạn và nhãn lớp (tên đối tượng) lên khung hình dựa trên kết quả phát
hiện (results).
- Khởi tạo biến kiểm tra nhận diện các lớp:
detected_classes = {'Sang': False, 'Phuong': False, 'ChaiNuoc': False}
Tạo một từ điển lưu trữ thông tin có đối tượng nào được phát hiện (True) hay không
(False).
- Vòng lặp xử lý các đối tượng được phát hiện (results):
for r in results:
Lặp qua từng kết quả phát hiện đối tượng trong results.
acls = r.boxes.cls
Lấy danh sách các lớp được phát hiện trong kết quả hiện tại.
for a in acls:
Lặp qua từng lớp được phát hiện trong danh sách.
cls_value = int(a.item())
Lấy giá trị (chỉ số lớp) của lớp được phát hiện và chuyển thành số nguyên.
Kiểm tra giá trị lớp (cls_value) và cập nhật trạng thái phát hiện trong từ điển
detected_classes:
if cls_value == 0:
Nếu giá trị lớp là 0, cập nhật detected_classes['Sang'] thành True
Tương tự kiểm tra các giá trị lớp khác (1 - "Phương", 2 - "Chai nước") và cập nhật từ
điển.
- Gửi dữ liệu qua cổng COM:
ser.write(str(cls_value).encode
Chuyển giá trị lớp (cls_value) thành chuỗi ký tự, mã hóa thành dạng byte và gửi qua
cổng COM với đối tượng ser.
- Kiểm tra các lớp chưa được phát hiện và gửi mã tương ứng:
for cls_name, detected in detected_classes.items():
if not detected:
if cls_name == 'Sang':
ser.write(b'4')
elif cls_name == 'Phuong':
ser.write(b'5')
elif cls_name == 'ChaiNuoc':
ser.write(b'6')
# vòng lặp for kiểm tra từng lớp đã được nhận diện hay không (detected). Nếu một lớp
không được nhận diện (not detected), chúng ta thực hiện các bước sau:
if cls_name == 'Sang':
ser.write(b'4')
# Nếu cls_name là 'Sang', thì gửi một mã tương ứng là b'4' qua cổng COM
elif cls_name == 'Phuong':
ser.write(b'5')
# Tương tự nếu cls_name là 'Phuong', chúng ta gửi mã b'5' qua cổng COM.
elif cls_name == 'ChaiNuoc':
ser.write(b'6')
# Cuối cùng nếu cls_name là 'chainuoc', chúng ta gửi mã b'6' qua cổng COM
6.Kết thúc.
vid.release()
Giải phóng tài nguyên được sử dụng bởi webcam hoặc tập tin video được liên kết với
biến vid.
Nói cách khác, nó "tắt" webcam hoặc "đóng" video.
cv2.destroyAllWindows()
Đóng tất cả cửa sổ hiển thị được tạo bởi OpenCV.

Code mikroC dùng PIC 18F4550


// khai báo hai biến gửi và nhận dữ liệu
char TransmitData, ReceiveData;
void main() {
// cấu hình chân vi điều khiển thành chân số
ADCON1 |= 0x0F;
CMCON |=7;
// khai báo port E
PORTE =0x00; LATE = 0x00;
TRISE1_bit = 0;
TRISE2_bit = 0;
TRISE0_bit = 0;
// đặt trang thái ban đầu của lat e bằng 1 cấu hình cho đầu ra tích cực thấp
LATE1_bit = 1;
LATE2_bit = 1;
LATE0_bit = 1;
// cấu hình UART với tốc độ baurate bằng 9600
UART1_Init(9600);
delay_ms(100); // delay giúp chương trình ổn định

while(1)
{
// kiểm tra xem có dữ liệu nhận được từ uart hay không
if(UART1_Data_Ready() == 1)
{
ReceiveData = UART1_Read();
// nếu biến nhận là 0 tiến hành bật led ở chân RE0
if(ReceiveData == '0')
{
LATE0_bit = 0;
}
// nếu nhận được 4 thì tiến hành tắt led ở chân REO
else if(ReceiveData == '4')
{
LATE0_bit = 1;
}
// nếu biến nhận là 1 tiến hành bật led ở chân RE1
if(ReceiveData == '1')
{
LATE1_bit = 0;
}
// nếu biến nhận là 5 tiến hành tắt led ở chân RE1
else if (ReceiveData == '5')
{
LATE1_bit = 1;
}
// nếu biến nhận là 2 tiến hành bật led ở chân RE2
if(ReceiveData == '2')
{
LATE2_bit = 0;
}
// nếu biến nhận là 6 tiến hành tắt led ở chân RE2
else if (ReceiveData == '6')
{
LATE2_bit = 1;
}
}
}

Mô phỏng
Nhận 1 đối tượng

Nhận 2 đối tượng


Nhận 3 đối tượng

You might also like