Webcam là thiết bị đầu vào phổ biến nhất, rẻ tiền nhất so với các loại camera khác. Tầm 150k là đã mua được, loại tốt cũng khoảng 500k đến 1 triệu. Do đó Webcam phù hợp nhất với sinh viên và người nghiên cứu không chuyên
Webcam bình thường tầm 13-14 fps [frame per second] chỉ phù hợp với các ứng dụng đơn giản. Muốn làm chuyên nghiệp cần mua những loại webcam tốt, chí chí là camera IP để dễ dàng hơn trong công việc giải quyết bài toán ra
Kinh nghiệm cho thấy phần cứng tốt sẽ thiết lập chương trình dễ dàng hơn. Nếu không đầu tư cho phần cứng, tính toán còn sai sót hơn về công sức và đôi khi bế tắc
OpenCV cung cấp sẵn class cv. VideoCapture[] với rất nhiều khả năng. đọc webcam, đọc camera IP và video. Do 3 source đều có chung đặc điểm là liên tục trả về hình ảnh [gọi là frame] nên dùng chung class
Kiểm tra webcam trước khi thiết lập chương trình
Cách 1. Dùng web kiểm tra, các bạn vào trang web https. // kiểm tra webcam. com/fps để phát webcam trực tiếp từ trang web
cách 2. sử dụng phần mềm Webcam viewer portable V1. 0 to check
Read image
Mã bên dưới lấy hình ảnh từ camera 0, mỗi khi lấy xong hình ảnh sẽ dừng lại 30 mili giây để giới hạn còn 30 khung hình/giây
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cv. . Quay video cap = cv. . Quay video[0];
if [giới hạn. được mở[]] > khung;
cv. . imshow[windowName, frame];
cv. . waitKey[30];
}
}
khác
{
Lỗi in["Không tìm thấy máy ảnh nào"];
}
Có 2 cách đọc hình ảnh và đều cho ra kết quả như nhau
1
2
giới hạn >> khung;
giới hạn. đọc[khung];
Khi lấy được hình ảnh công việc tiếp theo là xử lý, tùy theo yêu cầu mà thời gian xử lý khác nhau. 1 ứng dụng được gọi là xử lý thời gian thực [quy trình thời gian thực] phải đạt tối thiểu 10fps. Có nghĩa là 1 khung hình bạn phải xử lý tối đa 100 mili giây, nếu nhiều hơn phải xử lý tối đa luồng
Lưu ý. phải sao chép tệp opencv_ffmpeg320. dll vào cùng thư mục với file exe [giả sử đang sử dụng opencv 3. 2. 0]
Khi chơi máy ảnh bằng OpenCV, bạn sẽ thường gặp sự cố độ trễ của máy ảnh. Nếu thời gian xử lý mỗi khung càng nhiều thì độ trễ càng nghiêm trọng
Lý do là dòng camera hình ảnh về có bộ đệm, lấy tuần tự ra để hiển thị. Do đó phương pháp giải quyết là sử dụng 2 luồng, 1 luồng đọc khung mới nhất và 1 luồng xử lý
Bài này hướng dẫn play camera IP trong OpenCV không bị delay bằng cách viết 1 lớp thay thế cho VideoCapture. Sau khi thay thế, cách sử dụng cũng gần giống như cũ, không khác biệt nhiều
Khai báo lớp VideoCapture
con trăn1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
nhập phân luồng
nhập hàng đợi
nhập cv2
class VideoCapture.
def __init__[self, name]:
bản thân. cap = cv2. Quay video[tên]
bản thân. q = hàng đợi. Hàng đợi[]
t = phân luồng. Chủ đề[mục tiêu = bản thân . ._reader]
t. daemon = True
t. bắt đầu[]
# khung đọc ngay khi có sẵn, chỉ giữ lại khung gần đây nhất
def _reader[self]:
trong khi Đúng.
rút lại, khung = self.giới hạn. đọc[]
if không thuê.
nghỉ
nếu không phải chính mình. q. trống[].
thử.
bản thân. q. get_nowait[] # discard
ngoại trừ hàng đợi. Trống.
vượt qua
bản thân. q. đặt[khung]
def read[self]:
trả về chính mình. q. nhận[]
def giải phóng[bản thân]:
bản thân. giới hạn. phát hành[]
Cách sử dụng
con trăn1
2
3
4
5
6
7
8
9
10
url = "rtsp. //quản trị viên. hd543211@192. 168. 1. 127. 554/0"
video_capture = VideoCapture[url]
trong khi Đúng.
frame = video_capture. đọc[]
cv2. imshow['frame', frame]
if cv2. waitKey[30] & . 0xFF == ord['q']:
nghỉ
video_capture. phát hành[]
Giải thích
Trong class VideoCapture sẽ tạo 1 thread để chạy hàm _reader[]. Hàm này có công dụng chạy liên tục để lấy khung hình mới nhất, độc lập với hàm trong khi hiển thị hình ảnh
Trong hàm while main thì mỗi khi gọi hàm read[] để lấy frame thì class VideoCapture sẽ trả về frame mới nhất, do đó sẽ giảm độ trễ đi rất nhiều