Webcam python không có opencv

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ăn

1

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ăn

1

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

Chủ Đề