使用IPcam和谷歌colab的视频捕捉

时间:2018-03-15 09:10:50

标签: networking video-capture google-colaboratory

我已经安装了opencv-python和dlib。我感兴趣的领域是面部识别。因此,基本上尝试提取面部,我有一个ipcam或网络摄像头。尽管如此,我无法访问摄像头。我正在使用的代码是

    import numpy as np
    import cv2
    cap = cv2.VideoCapture('http://192.168.43.1:8080/video')
    #cap = cv2.VideoCapture('http://192.168.43.1:8080/onvif/device_service')
    #cap = cv2.VideoCapture('rtsp://192.168.43.1:8080/h264_ulaw.sdp')
    #cap = cv2.VideoCapture('rtsp://192.168.43.1:8080/h264_pcm.sdp')
    print(cap.isOpened())
    while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    # Our operations on the frame come here
    if ret is True:
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY))

    if cv2.waitKey(1) & 0xFF == ord('q'):
     break
    # When everything done, release the capture
    cap.release()
    cv2.destroyAllWindows()

但是我尝试打印语句总是假的 在我的本地Windows机器上它工作正常。使用colab.research.google.com的主要目的是我的机器不能正确支持clke用于dlib和face_recognition

5 个答案:

答案 0 :(得分:0)

您正在通过Colab执行的python代码正在VM上执行;这个Python进程无法(安全地)直接与本地计算机上的网络摄像头进行通信。

答案 1 :(得分:0)

也许使用公共IP地址可以通过CV打开和捕获来自摄像机的视频。

答案 2 :(得分:0)

  

因为,每当您在colab上运行代码时,它都在其服务器上而不是您本地的服务器上运行   机。无论您粘贴的是本地IP。只能在您的网络内解决。

  1. 首先,您必须使用ipconfig命令来获取公共ip
  2. 但是,实际上,当您粘贴网址时,Google的服务器将尝试 为您呈现视频。但是,您的工作站中装有网络摄像头 可用的供稿位于您的网关后面。 (您的专用网络)。
  3. 这意味着您的本地网络外部无法访问它。 因为,默认情况下,这是为了避免IP耗尽和客观地 为您的机器提供安全性。

如果您想将机器暴露在外界中(有风险),仍然可以使用。您可以寻找NAT。 (网络地址解读)。

  • 您必须与ISP联系。是否拥有静态IP,因为 通常只要您打开或关闭网络,就会有一个新的动态IP 已分配给您的机器。因此,无论何时切换网络,都必须在代码中更改IP。
  • 在这里了解如何设置:Link

答案 3 :(得分:0)

正如人们所说,由于Google colab在虚拟机上运行,​​因此您无法直接访问IP网络摄像头。这是我访问笔记本电脑网络摄像头的操作。

def take_photo(filename='photo.jpg', quality=0.8):
  js = Javascript('''
    async function takePhoto(quality) {
      const div = document.createElement('div');

      const video = document.createElement('video');
      video.style.display = 'block';
      const stream = await navigator.mediaDevices.getUserMedia({video: true});

      document.body.appendChild(div);
      div.appendChild(video);
      video.srcObject = stream;
      await video.play();

      // Resize the output to fit the video element.
      google.colab.output.setIframeHeight(document.documentElement.scrollHeight, true);

      const canvas = document.createElement('canvas');
      canvas.width = video.videoWidth;
      canvas.height = video.videoHeight;
      canvas.getContext('2d').drawImage(video, 0, 0);
      stream.getVideoTracks()[0].stop();
      div.remove();
      return canvas.toDataURL('image/jpeg', quality);
    }
    ''')
  display(js)
  data = eval_js('takePhoto({})'.format(quality))
  resp = urllib.request.urlopen(data)
  image = np.asarray(bytearray(resp.read()), dtype="uint8")
  image = cv2.imdecode(image, cv2.IMREAD_COLOR)
  # return the image
  return image

# to capture an image
img = take_photo()

take_photo()函数使用javascript访问连接到系统的网络摄像头。希望它会有所帮助。 :)

答案 4 :(得分:0)

您可以使用ngrok将IP公开,然后可以通过ngrok IP访问摄像机。

  1. 安装ngrok-https://ngrok.com/download
  2. 通过-./ngrok http http://192.168.43.1:8080/video
  3. 使用它

它将生成ngrok IP,该IP可使用12小时。

您可以通过传入 cv2.VideoCapture(ngrok_ip)来使用它。