2017-12-12 18 views
0

opencv(C++)からgstreamerパイプラインに書き込もうとしています。私はそれをすべてセットアップしましたが、プログラムを実行すると出力もエラーもなく、コード内にも表示されません。それは何もしません。私は "-vvv"を使ってみましたので、結果は表示されません。ここに私のコード:Gstreamer OpencvのSilently Diesでパイプラインに書き込む

#include "opencv2/opencv.hpp" 


#include <string> 
#include <iostream> 
#include <sstream> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 
using namespace cv; 

int main(int, char**) 
{ 


    const char* right_cam_gst = "nvcamerasrc sensor-id=0 ! video/x-raw(memory:NVMM),\ 
               width=(int)640,\ 
               height=(int)360,\ 
               format=(string)I420,\ 
               framerate=(fraction)10/1 ! nvvidconv flip-method=2 ! video/x-raw,\ 
               format=(string)I420 ! videoconvert ! video/x-raw,\ 
               format=(string)BGR ! appsink"; 


    VideoCapture capture(right_cam_gst); // open the default camera 
    if(!capture.isOpened()) // check if we succeeded 
     return -1; 

    VideoWriter writer; 
    writer.open("-vvv appsrc ! video/x-raw,format=YUY2,width=640,height=480 ! jpegenc ! rtpjpegpay ! udpsink -vvv host=127.0.0.1 port=5000", 0, (double)10, Size(640, 360), true); 


    Mat distCoeffs; 
    Mat intrinsic; 

    cv::FileStorage storage("CamData.yml", cv::FileStorage::READ); 
    storage["distCoeffs"] >> distCoeffs; 
    storage["intrinsic"] >> intrinsic; 
    storage.release(); 




    Mat image; 
    Mat imageUndistorted; 

    while(1) 
    { 
     capture >> image; 
     undistort(image, imageUndistorted, intrinsic, distCoeffs); 
     writer << imageUndistorted; 

     // imshow("win1", image); 
     imshow("win2", imageUndistorted); 
     waitKey(1); 
    } 

     capture.release(); 

    return 0; 
} 

かなり簡単です。それは、ビデオをつかみ、それを歪ませず、imwriteとgstreamerパイプラインの両方にプリントします(ビデオはimwriteで表示されます)。私が実行した場合、ポート5000上のデータは絶対に存在しないことを見つけるためにnc -l 5000 -uしかし:ポート上の

gst-launch-1.0 -v videotestsrc ! video/x-raw,format=YUY2,width=640,height=480 ! jpegenc ! rtpjpegpay ! udpsink host=127.0.0.1 port=5000

そして、シェルコマンドで表示データを、私はシェルコマンドを使用することができます。問題を診断するための次のステップは何ですか?ありがとう!

システム:NvidiaのJETSON TX1

+0

引数が見つかりました:! fakesink dump = TRUE! さて、パイプで:-vvv appsrc!ビデオコンバート! jpegenc! fakesink dump = TRUE データが取得されています。しかし、スティルはudpで何も得ません... – Zock77

+0

私は多分それがあなたがやっていることに関連している質問をしました。どのフィルタがフレームに適用され、どのような画像処理が行われているかを知りたい。私はあなたがより多くの情報を望むなら質問を掲示した。 https://stackoverflow.com/questions/47848575/gstreamer-and-frame-image-processing-filtering –

答えて

0

OK問題がキャップにあったように見えますので。この1はVLCでうまく動作します。ここでは、そのgstreamの問題を診断しようとしている他の誰のために

-vvv appsrc ! videoconvert ! video/x-raw, width=640, height=360, format=I420 ! x264enc ! mpegtsmux ! rtpmp2tpay ! udpsink host=199.58.96.228 port=5000 

はいくつかのヒントがあります:

は、データがパイプにそのポイントになっているかどうかを確認するために! fakesink dump=TRUE !を使用してください。

appsrc ! fakesink dump=TRUEのような簡単なパイプから始めます。コンソールにデータがある場合、appsrcがデータを取得していることがわかります。

appsrc ! videoconvert ! video/x-raw, width=640, height=360, format=I420 ! fakesink dump=TRUE 

これはビデオを変換して印刷することです。それでもデータがあれば、それは正しく変換され、移動することができます。そうでない場合は、適切な形式、解決法を持っていることを確認してください。

ストリームが正しく変換されるまで、要素の追加とテストを続けます。次に、udpsinkを追加できます。

希望すると便利です。

関連する問題