【问题标题】:UDP livestream (GoPro Hero4) opens using OpenCV in python but not in C++UDP livestream (GoPro Hero4) 在 python 中使用 OpenCV 打开,但在 C++ 中没有
【发布时间】:2022-01-01 01:34:20
【问题描述】:

我想在 C++ 中使用 OpenCV 对 GoPro Hero4 Black 直播进行图像处理。固件版本为5.0。

使用 python 可以成功运行。当我在 C++ 状态 31 和 32 中以相同(!)方式实现它时,在打开 VideoCapture 时切换为 1,因此启动了直播并连接了客户端。但是,后面的 cap.isOpen() 返回 false。我需要补充一点,cap.open(...) 命令会让程序停止几秒钟,这是不合理的。

python中的代码

import cv2
import numpy as np
from time import time
import socket
from goprocam import GoProCamera
from goprocam import constants
import requests

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
t=time()

url     = "http://10.5.5.9/gp/gpControl/execute?p1=gpStream&a1=proto_v2&c1=restart"
payload = {  }
headers = {}
res = requests.post(url, data=payload, headers=headers)

cap = cv2.VideoCapture("udp://10.5.5.9:8554")

while (cap.isOpened()):
    nmat, frame = cap.read()
    if nmat == True:
        cv2.imshow("GoPro OpenCV", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    if time() - t >= 2.5:
        sock.sendto("_GPHD_:0:0:2:0.000000\n".encode(), ("10.5.5.9", 8554))

        t=time()
# When everything is done, release the capture
cap.release()
cv2.destroyAllWindows()

C++代码

#define CURL_STATICLIB
#include <curl\curl.h>
#include <boost/exception/exception.hpp>
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <boost/asio.hpp>

#include <iostream>

#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"

using namespace cv;

int main()
{
    CURL* curl;
    curl = curl_easy_init();
    if (curl) {

        curl_easy_setopt(curl, CURLOPT_URL, "http://10.5.5.9/gp/gpControl/execute?p1=gpStream&c1=start");
        curl_easy_perform(curl);
        curl_easy_setopt(curl, CURLOPT_URL, "http://10.5.5.9/gp/gpControl/execute?p1=gpStream&c1=restart");
        curl_easy_perform(curl);
    }

    boost::asio::io_service ioService;
    boost::asio::ip::udp::resolver resolver(ioService);
    boost::asio::ip::udp::endpoint dest(boost::asio::ip::address::from_string("10.5.5.9"), 8554);
    boost::asio::ip::udp::socket sock(ioService, boost::asio::ip::udp::v4());
    boost::this_thread::sleep_for(boost::chrono::milliseconds(2000));
    sock.send_to(boost::asio::buffer("_GPHD_:0:0:2:0.000000\n", 22), dest);
    
    VideoCapture cap;

    cap.open("udp://10.5.5.9:8554");

    while (cap.isOpened() )
    {
        std::cout << "is open" << std::endl;

    }

    return 0;
}

有人知道如何解决这个问题吗?

我还为 VideoCapture 尝试了不同的 API 参考

cap.open("udp://10.5.5.9:8554", CAP_ANY);
cap.open("udp://10.5.5.9:8554", CAP_FFMPEG);

我也尝试过使用@前缀

cap.open("udp://@10.5.5.9:8554", CAP_ANY);

更新: 我无法测试 VideoCapture 后端的正确执行,因为似乎无法在 python 中使用 CAP_FFMPEG 打开笔记本电脑网络摄像头。 但是,当我通过声明索引 0 并使用 CAP_FFMPEG 后端让笔记本电脑网络摄像头运行时,我得到的行为与声明 gopro udp 直播时相同。

cap.open(0, CAP_FFMPEG);

【问题讨论】:

  • 在您的示例中缺少cv::VideoCapture cap 声明。
  • 没错.. 当我粘贴到 stackoverflow 时,我无意中删除了它。它现在就在那里。

标签: python c++ opencv udp gopro


【解决方案1】:

解决方案是停用专用网络的 Windows 防火墙。再简单不过了,但万一有人在那个时候挣扎……这里是提示:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2021-09-10
    • 2016-07-10
    • 2023-04-07
    • 2014-10-24
    • 2015-09-04
    相关资源
    最近更新 更多