我想在 GoPro Hero4 Black 直播上使用 C 中的 OpenCV 進行影像處理。韌體版本為 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);
uj5u.com熱心網友回復:
解決方案是停用專用網路的 Windows 防火墻。再簡單不過了,但萬一有人在這一點上掙扎……這是提示:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/365638.html
