2017-12-12 5 views
0

opencv (C++) 내에서 gstreamer 파이프 라인에 쓰려고합니다. 모든 설정이 끝났지 만 프로그램을 실행해도 출력이없고 오류도없고 코드에도 표시되지 않습니다. 단지 아무 것도하지 않습니다. "-vvv"를 사용하여 시도 했으므로 최대 결과는 표시되지 않습니다. 내 코드는 다음과 같습니다.Gstreamer Opencv에서 파이프 라인에 자동으로 쓰십시오.

#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

그런 다음 쉘 명령은 데이터를 내가 쉘 명령을 사용할 수 있습니다. 문제를 진단하기위한 다음 단계는 무엇입니까? 감사!

시스템 : 문제는 대문자처럼 보이는 있도록 엔비디아 젝슨 TX1은

+0

그냥 인수를 찾았습니다 :! 가짜 덤프 = TRUE! 이제 파이프가 있습니다. -vvv appsrc! videoconvert! jpegenc! fakesink 덤프 = TRUE 데이터를 가져 오는 중입니다. Stil은 udp로는 아무 것도 얻지 못합니다. – Zock77

+0

나는 당신이하는 일과 관련이 있을지도 모릅니다. 어떤 필터가 프레임에 적용되고 어떤 이미지 처리가 수행되는지 알고 싶습니다. 나는 더 많은 정보를 원한다면 질문을 올렸다. https://stackoverflow.com/questions/47848575/gstreamer-and-frame-image-processing-filtering –

답변

0

확인을 클릭합니다. 이 사람은 VLC 잘 작동 : 데이터가 파이프의 해당 위치에가는 경우

사용 ! fakesink dump=TRUE !보고 : 다른 사람이 자신의 gstream으로 문제를 진단하려고 들어

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

, 여기에 몇 가지 도움말입니다.

appsrc ! fakesink dump=TRUE과 같은 간단한 파이프로 시작하십시오. 콘솔에 데이터가 있으면 appsrc가 데이터를 가져 오는 것을 알 수 있습니다. 그런 다음 조금 더 이상 뭔가를 이동 :

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

이 모든 것이 비디오를 변환하고 그것을 인쇄합니다. 그래도 데이터가 있으면 올바르게 변환되고 계속 진행할 수 있습니다. 그렇지 않은 경우 올바른 형식, 해상도를 가지고 있는지 확인하십시오.

요소를 계속 추가하고 스트림이 올바르게 변환 될 때까지 테스트하십시오. 그런 다음 udpsink를 추가 할 수 있습니다.

희망이 도움이됩니다.

관련 문제