2017-11-18 9 views
0

OpenCVバージョン3.1、Windows x64でOpenCV VideoCaptureクラスを使用してビデオストリームを開こうとしています。私のラズベリーパイで私はmjpg_streamerが動作していて、出力はhttp://192.168.1.245:8080/?action=streamで見ることができますが、OpenCVでビデオストリームを開くとストリームを開くことができません。OpenCV MJPG Streamerが動作しない

これはデバッグに使用しているコードで、接続に関する問題が発生している他の人にも有効です。

#include <opencv2\core.hpp> 
#include <opencv2\videoio.hpp> 
#include <string> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    cv::VideoCapture vcap; 
    cv::Mat raw_image; 

    const string videoStreamAddress = "http://192.168.1.245:8080/?action=stream"; 

    if (!vcap.open(videoStreamAddress)) 
    { 

     cout << "Error opening video stream" << endl; 
     system("pause"); 
     return -1; 
    } 

    cout << "Stream opened" << endl; 
    system("pause"); 
    return 0; 
} 

オンラインでは、OpenCVにはリンクにビデオ拡張子が必要です。 http://192.168.1.245:8080/?action=stream?dummy=param.mjpghttp://192.168.1.245:8080/?action=stream&type=.mjpg、&チャネル= 0 & .mjpg、& type = .mjpegのような他の人が使用している拡張機能を使用しようとしましたが、動作しません。また、私はcmakeでffmpegを有効にして、それを使ってビルドしました。この時点では他の人にとってはうまくいくと思われますが、トピックには他に何もないようです。これに対する解決策は何ですか?

+2

「待ちます!私が下降する理由は、既存の仕事があるからではありません。だから、あなたはこのコードをデバッグしていると言いましたが、デバッグの研究がこれまでに示したことの多くを実際には表示していません。 –

+0

@MarcusMüllerそれを得ました、私はもう少し追加しようとします。 –

+0

VLCでストリームを再生できますか? – Micka

答えて

0

@ api55の提案のおかげで、私はストリームを取得してからraw jpgデータをopencvに渡して、最初にやりたいことをやり遂げることができました。

link @ api55のソリューションのC++コードは、(link to python solution)です。

try 
    { 

     boost::asio::io_service io_service; 

     tcp::resolver resolver(io_service); 
     tcp::resolver::query query("192.168.1.245", "8080"); 
     tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 

     tcp::socket socket(io_service); 
     boost::asio::connect(socket, endpoint_iterator); 

     std::string jpgimg = ""; 

     std::stringstream request_; 

     request_ << "GET /?action=stream HTTP/1.1\r\n"; 
     request_ << "Host: 192.168.1.245\r\n"; 
     request_ << "Accept-Encoding: *\r\n"; 
     request_ << "\r\n"; 

     boost::system::error_code ignored_error; 
     boost::asio::write(socket, boost::asio::buffer(request_.str()), ignored_error); 

     for (;;) 
     { 
      char buf[1025]; 
      buf[1024] = '\0'; 
      boost::system::error_code error; 

      size_t len = socket.read_some(boost::asio::buffer(buf,1024), error); 

      if (error == boost::asio::error::eof) 
       break; // Connection closed cleanly by peer. 
      else if (error) 
       throw boost::system::system_error(error); // Some other error. 

      jpgimg.append(buf,buf+len); 

      int a = jpgimg.find("\xff\xd8"); 
      int b = jpgimg.find("\xff\xd9"); 

      if (a != -1 && b != -1) 
      { 
       Mat rawData(1, b-a+2, CV_8UC1, (void*)(&jpgimg[a])); 

       Mat i = cv::imdecode(rawData, CV_LOAD_IMAGE_COLOR); 
       cv::imshow("i", i); 
       if (cv::waitKey(1) == 27) 
       break; 

       jpgimg = jpgimg.substr(b+2); 
      } 

     } 
    } 
    catch (std::exception& e) 
    { 
     std::cerr << e.what() << std::endl; 
    } 

これは決して最適化されておらず、純粋に他の場所での実装のベースです。 Boost ASIO 1.65.1では、ラズベリーpi(ポート8080)のmjpg_streamerへのストリームを開き、元のリンクの/?action = stream部分に対してHTTP GETリクエストを送信し、jpgデータの先頭と( "\ xff \ xd8"と "\ xff \ xd9")、このデータをimdecodeを通してOpenCVに送ります。

資源:OpenCVの生のjpgデータを使用して How to parse MJPEG HTTP Stream within C++?

ブーストASIOクライアントコード:JPGのみがどのように機能するかについて http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/tutorial/tutdaytime1.html

情報 opencv read jpeg image from buffer

うまくいけばOpe nCVは今後、より良いmjpgサポートを提供します。

関連する問題