2017-03-13 34 views
1

私は現在、rtsp ip camで顔認識を行う必要があるプロジェクトに取り組んでいます。問題なくrtspフィードを取得できましたが、顔認識を適用するとビデオフィードが遅くなり、大きな遅延が見られます。私はマルチスレッドを使用しても、よりうまくいっていますが、成功していません。私のコードはまだマルチスレッドの初心者です。私はrtspカメラストリームを使用するとopencvビデオキャプチャで遅れます

#include <iostream> 
#include <thread> 
#include "opencv2/opencv.hpp" 

#include <vector> 
using namespace std; 
using namespace cv; 
void detect(Mat img, String strCamera) { 
    string cascadeName1 = "C:\\ocv3.2\\Build\\install\\etc\\haarcascades\\haarcascade_frontalface_alt.xml"; 
    CascadeClassifier facedetect; 
    bool loaded1 = facedetect.load(cascadeName1); 
    Mat original; 
    img.copyTo(original); 
    vector<Rect> human; 
    cvtColor(img, img, CV_BGR2GRAY); 
    equalizeHist(img, img); 
    facedetect.detectMultiScale(img, human, 1.1, 2, 0 | 1, Size(40, 80), Size(400, 480)); 
    if (human.size() > 0) 
    { 
     for (int gg = 0; gg < human.size(); gg++) 
     { 
      rectangle(original, human[gg].tl(), human[gg].br(), Scalar(0, 0, 255), 2, 8, 0); 
     } 
    } 
    imshow("Detect " + strCamera, original); 
    int key6 = waitKey(40); 
    //End of the detect 
} 
void stream(String strCamera) { 
    VideoCapture cap(strCamera); 
    if (cap.isOpened()) { 
     while (true) { 
      Mat frame; 
      cap >> frame; 
      resize(frame, frame, Size(640, 480)); 
      detect(frame, strCamera); 
     } 
    } 
} 
int main() { 
    thread cam1(stream, "rtsp://admin:[email protected]:554/live2.sdp?tcp"); 
    thread cam2(stream, "rtsp://admin:[email protected]/live2.sdp?tcp"); 
    cam1.join(); 
    cam2.join(); 
    return 0; 
} 

答えて

0

私は同様の問題があり、フレームキャプチャを画像の処理から完全に隔離することで問題を解決できました。また、OpenCVを最新版(3.2.0)にアップデートしましたが、これも以前のバージョンの問題を解決すると思います。

void StreamLoop(String strCamera, LFQueue1P1C<Mat> *imageQueue, bool *shutdown) { 
    VideoCapture cap(strCamera, CV_CAP_FFMPEG); 
    Mat image; 

    while(!(*shutdown) && cap.isOpened()){ 
     *cap >> image; 
     imageQueue->Produce(image); 
    } 

} 

int main(){ 
    Mat aImage1; 
    bool shutdown(false); 
    LFQueue1P1C<Mat> imageQueue; 
    string rstp("rtsp://admin:[email protected]:554/live2.sdp?tcp"); 
    thread streamThread(StreamLoop, rtsp, &imageQueue, &shutdown); 

... 

    while(!shutdownCondition){ 
     if(imageQueue.Consume(aImage1)) { 
      // Process Image 
      resize(aImage1, aImage1, Size(640, 480)); 
      detect(aImage1, rtsp); 
     } 
    } 

    shutdown = true; 
    if(streamThread.joinable()) streamThread.join(); 

... 
    return 0; 
} 

フレームを拾いながらも、わずかなポーズがある場合、それは簡単にハングアップしたOpenCVのでRTSPといくつかの問題があるようです。あまりポーズを取らずにフレームを拾う限り、私は問題は見ていません。

また、ビデオカメラがローカルネットワークに直接接続されている場合、この問題は発生しませんでした。リモートサイトに展開してからハングアップを開始するまではありませんでした。フレームの取得と処理を別々のスレッドに分けて私の問題を解決しました。うまくいけば、このソリューションが役に立つと思うかもしれません。

注:私が使用したキューは、あるスレッドから別のスレッドにアイテムを渡すカスタムキューです。私が投稿したコードは、この問題をより読みやすくして適用できるように、元のコードから変更されています。

は、私はまだ任意のヘルプはあなたに将来的に問題が発生します出射する方法がないのスレッドを持つ

いただければ幸いですので、マルチスレッド事項の初心者です。テストコードであっても、コードに終了パスがあることを確認する習慣を覚えてください。例:コードの一部を後でコピーして貼り付け、そこに無限ループがあることを忘れてしまい、後で謎のクラッシュやリソースがロックされた原因を追跡しようとする大きな悲しみが発生します。

関連する問題