0

我想在 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);
4

1 回答 1

0

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

于 2021-11-24T16:43:33.170 回答