1

GStreamer を使用して IP カメラのビデオ コンテンツをキャプチャし、それを H.264 ストリーム サーバーに圧縮してから、OpenCV+GStreamer を使用して nvidia TX1 で H.264 ビデオ ストリームを受信したいと考えています。私の gstreamer パイプラインは次のとおりです。

gst-launch-1.0 -ve rtspsrc location=rtsp://admin:12345@192.168.1.64/Streaming/Channels/1 ! nvvidconv flip-method=6 ! 'video/x-raw(memory:NVMM), width=(int)960, height=(int)540, format=(string)I420, framerate=(fraction)30/1' ! omxh264enc control-rate=2 bitrate=4000000 ! 'video/x-h264, stream-format=(string)byte-stream' ! h264parse ! queue ! omxh264dec ! nvvidconv ! 'video/x-raw, format=(string)UYVY' ! videoconvert ! jpegenc quality=30 ! rtpjpegpay ! udpsink host=$CLIENT_IP port=5000 sync=false async=false

上記のコードは、カメラのコンテンツをキャプチャして 960p の 30 フレームの H.264 ビデオ ストリームに圧縮し、UDP プロトコル [5000] を介してボードのネットワーク ポートに送信します。クライアントの:

#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/opencv.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
#include <opencv2/features2d/features2d.hpp>  
#include <opencv2/calib3d/calib3d.hpp>  

using namespace cv;  

int main(int, char**)  
{  
  VideoCapture input("./stream.sdp");  
  if(!input.isOpened()){  // check if we succeeded                                                                                                                                                                       
    std::cout<< "open failed" << std::endl;  
    return -1;  
  }  

  Mat img, img_gray;  
  OrbFeatureDetector detector(7000);  
  vector<KeyPoint> img_keypoints, car_keypoints;  
  Mat img_descriptors, car_descriptors;  

  input.read(img);  
  Mat car;  
  img(Rect(400, 320, 150, 100)).copyTo(car);  

  detector(car, Mat(), car_keypoints, car_descriptors);  
  drawKeypoints(car, car_keypoints, car);  
  for(;;)  
    {  
      if(!input.read(img))  
        break;  
      detector(img, Mat(), img_keypoints, img_descriptors);  
      drawKeypoints(img, img_keypoints, img);  


      BFMatcher matcher;  
      vector<DMatch> matches;  
      matcher.match(car_descriptors, img_descriptors, matches);  

      vector<Point2f> car_points, img_points;  
      for(int i=0; i < matches.size(); ++i){  
        car_points.push_back(car_keypoints[matches[i].queryIdx].pt);  
        img_points.push_back(img_keypoints[matches[i].queryIdx].pt);  
      }  
      std::cout<<"car points count = " << car_points.size() << std::endl;  

      if(car_points.size() >= 4){  
        Matx33f H = findHomography(car_points, img_points, CV_RANSAC);  

        vector<Point> car_border, img_border;  
        car_border.push_back(Point(0, 0));  
        car_border.push_back(Point(0, car.rows));  
        car_border.push_back(Point(car.cols, car.rows));  
        car_border.push_back(Point(car.cols, 0));  
        for (size_t i = 0; i < car_border.size(); ++i){  
          Vec3f p = H * Vec3f(car_border[i].x, car_border[i].y, 1);  
          img_border.push_back(Point(p[0]/p[2], p[1]/p[2]));  
        }  
        polylines(img, img_border, true, CV_RGB(255, 255, 0));  
        Mat img_matches;  
        drawMatches(car, car_keypoints, img, img_keypoints, matches, img_matches);  
        imshow("img_matches", img_matches);  
      }  
      // imshow("car", car);                                                                                                                                                                                             
      // imshow("img", img);                                                                                                                                                                                             
      if(waitKey(27) >= 0) break;  
    }  
  // the camera will be deinitialized automatically in VideoCapture destructor                                                                                                                                           
  return 0;  
}  

構成ファイル CMakeLists.txt は次のとおりです。

project(hello)  
find_package(OpenCV REQUIRED)  
include_directories(${OpenCV_INCLUDE_DIRS})  
add_executable(cv_hello hello.cpp)  
target_link_libraries(cv_hello ${OpenCV_LIBS}

クライアント コードは正常にコンパイルできますが、実行VideoCapture input("./stream.sdp")すると、sdp ファイルを開くことができず、「open failed」が返されます。これが私の stream.sdp ファイルです。

c=IN IP4 127.0.0.1  
m=video 5000 RTP/AVP 96  
a=rtpmap:96 JPEG/4000000  

絶対パスを使用しようとし、環境変数 export PKG_CONFIG_PATH=/home/ubuntu/ffmpeg_build/lib/pkgconfig : $PKG_CONFIG_PATHを設定して ffmeg デコーダーを追加しようとしましたが、すべて問題を解決できませんでした。TX1 で opencv 2.4.13 と gstreamer-1.0 を使用しています。

4

0 に答える 0