Làm cách nào để truy cập webcam trong OpenCV trên PythonAnywhere thông qua Javascript?


8

Tôi đã phát triển Ứng dụng web trong Django có phương thức xem chứa mã OpevCV khi được kích hoạt sẽ mở webcam người dùng để phát hiện khuôn mặt của nó. Ứng dụng này hoạt động tốt trong máy chủ cục bộ của tôi nhưng khi tôi đã lưu trữ nó trên PythonAnywhere thì nó nói rằng máy ảnh không được tìm thấy vì lưu trữ PA của tôi không phục vụ máy ảnh.
Vì vậy, một người nào đó đề nghị tôi mở webcam thông qua javascript vì nó giao dịch với máy khách và sau đó chuyển nguồn cấp dữ liệu của nó cho máy chủ là máy chủ lưu trữ của tôi.
Nhưng vì tôi là một tân binh trong Python nên tôi không thể tìm ra cách thực hiện nhiệm vụ trên. Tôi đã tìm thấy đoạn mã js này nhưng tôi không biết cách và nơi để thêm mã này vào Ứng dụng Django.

Mã để nhận nguồn cấp dữ liệu bằng Javascript

var video = document.querySelector("#videoElement");

if (navigator.mediaDevices.getUserMedia) {
    navigator.mediaDevices.getUserMedia({video: true}).then(function(stream) {
      video.srcObject = stream;
  }).catch(function(err0r) {
      console.log("Something went wrong!");
  });
}

Mã Python của tôi để mở camera và phát hiện khuôn mặt như sau (nó hoạt động trong máy chủ cục bộ)

import cv2

cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')

cam = cv2.VideoCapture(0)


while True:
    ret, frame = cam.read()
    frame = cv2.flip(frame, 1)

    if ret:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        faces = cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3)

        for (x, y, w, h) in faces:
            cropped = cv2.resize(frame[y:y+h, x:x+w], (198,198))
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

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

        cv2.imshow('Stream', frame)

Bất kỳ trợ giúp được đánh giá cao. Cảm ơn bạn trước

Câu trả lời:


1

Tôi đã từng làm một cái gì đó tương tự, sơ đồ tôi đã sử dụng như sau:

Dòng dữ liệu

Như bạn đã biết, chúng tôi cần javascript để lấy hình ảnh của người dùng từ webcam. Tôi tìm thấy một bài viết chỉ cho chúng tôi cách làm điều đó, bạn chỉ có thể sử dụng phía frontend (tệp HTML) nếu bạn muốn sử dụng Django. Mã đó là để lấy hình ảnh và mã hóa nó thành base64 (chuỗi) và gửi nó qua websocket.

Sau đó, chúng tôi muốn Django phục vụ websocket. Trong quá khứ, tôi đã làm điều đó với Flask, không Django, nhưng bạn có thể xem làm thế nào bạn có thể tạo máy chủ WebSocket sử dụng django kênh .

Bước cuối cùng, bạn cần một hàm với mã OpenCV của bạn. Bạn cần giải mã base64chuyển đổi nó thành opencv

def modify_picture(img_data):
    # decode image
    img = from_b64(img_data)

    # your OpenCV filter
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # encode image to base64
    return to_b64(gray)

Và tất nhiên, bạn không cần while Truecv2.imshow, nhưng trả lại phiên bản base64 của bức ảnh mới của bạn. Hy vọng nó giúp.


Cập nhật: Tôi viết một mã mẫu trong github của tôi . Không phải ở Django, nhưng vẫn bằng Python. Hy vọng nó sẽ cung cấp cho bạn cái nhìn sâu sắc hơn.


hi sẽ mất một chút thời gian để thử giải pháp của bạn nhưng tôi vẫn chấp nhận cho những nỗ lực của bạn vì có giới hạn thời gian. cảm ơn sự giúp đỡ của bạn
Aayush Gupta

Xin chào, tôi đang vật lộn một chút để thực hiện điều này. Rất thích nghe nếu ai đó thành công!
Joesmaker

1
xin chào @Joesmaker, tôi chỉ đưa mẫu thực hiện cho khái niệm này. Bạn có thể xem câu trả lời cập nhật.
Tegar

@Tegar Này, cảm ơn vì đã chia sẻ!
Joesmaker

@Tegar tôi đã thử sử dụng mã git của bạn nhưng khi máy chủ được kích hoạt sau lần truy cập, một mảng trống xuất hiện nói rằng{ details: not found }
Aayush Gupta

-1

Bạn cần phải truyền phát video trực tiếp bằng javascript, sau đó cung cấp luồng đó cho opencv2 để nó hoạt động.

Sử dụng: có được video trực tiếp trong nodejs

Bạn sẽ nhận được một url "http://localhost:3000"mà bạn có thể sử dụng trong mã python như sau:

import cv2

cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')

cam = cv2.VideoCapture('http://localhost:3000')


while True:
    ret, frame = cam.read()
    frame = cv2.flip(frame, 1)

    if ret:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        faces = cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3)

        for (x, y, w, h) in faces:
            cropped = cv2.resize(frame[y:y+h, x:x+w], (198,198))
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

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

        cv2.imshow('Stream', frame)

xin chào giải pháp bạn đã cung cấp luồng video từ một tệp chứ không phải từ webcam trực tiếp của tôi.
Aayush Gupta

thật tuyệt nếu bạn có thể cho tôi một câu trả lời phù hợp với mã của tôi. thực sự giải pháp trên không hiệu quả với tôi
Aayush Gupta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.