2016-06-26 15 views
0

現在、処理されているライブビデオキャプチャを表示する必要があるプロジェクトで作業しています。したがって、私は、これに似たものを使用しています:パフォーマンスビデオのキャプチャと処理中に発生する問題

cv::VideoCapture cap(0); 
if (!cap.isOpened()) 
    return -1; 

cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720); 

cv::namedWindow("Current Capture"); 
for (;;) 
{ 
    cv::Mat frame; 
    cap >> frame;  
    cv::Mat mirrored; 
    cv::flip(frame, mirrored, 1); 
    cv::imshow("Current Capture", process_image(mirrored)); 

    if (cv::waitKey(30) >= 0) break; 
} 

私が持っている問題を、画像に円検出をperfomes process_imageは、スライドショーではなくなるように表示を終了するにはある程度の時間を必要とし、引き起こすことそれからビデオ。

私の質問は次のとおりです:どのように処理を高速化することができますprocess_imageの機能を操作せずにですか?

私は別のスレッドで画像処理を行うことを考えましたが、どうやって起動するのか分かりません。これ以外のアイデアはありますか?

PS:私はあなたが私のためにコードを書くことを期待していないよ、私はのみから開始するポイントを必要としています。)

EDIT:

[OK]を、私はできることは何も存在しない場合キャプチャ中のパフォーマンスについては、process_imageの機能を変更する必要があります。

cv::Mat process_image(cv::Mat img) 
{ 
    cv::Mat hsv; 
    cv::medianBlur(img, img, 7); 
    cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV); 

    cv::Mat lower_hue_range; // lower and upper hue range in case of red color 
    cv::Mat upper_hue_range; 
    cv::inRange(hsv, cv::Scalar(LOWER_HUE1, 100, 100), cv::Scalar(UPPER_HUE1, 255, 255), lower_hue_range); 
    cv::inRange(hsv, cv::Scalar(LOWER_HUE2, 100, 100), cv::Scalar(UPPER_HUE1, 255, 255), upper_hue_range); 

    /// Combine the above two images 
    cv::Mat hue_image; 
    cv::addWeighted(lower_hue_range, 1.0, upper_hue_range, 1.0, 0.0, hue_image); 

    /// Reduce the noise so we avoid false circle detection 
    cv::GaussianBlur(hue_image, hue_image, cv::Size(13, 13), 2, 2); 

    /// store all found circles here 
    std::vector<cv::Vec3f> circles; 
    cv::HoughCircles(hue_image, circles, CV_HOUGH_GRADIENT, 1, hue_image.rows/8, 100, 20, 0, 0); 

    for (size_t i = 0; i < circles.size(); i++) 
    { 
     /// circle center 
     cv::circle(hsv, cv::Point(circles[i][0], circles[i][1]), 3, cv::Scalar(0, 255, 0), -1, 8, 0); 
     /// circle outline 
     cv::circle(hsv, cv::Point(circles[i][0], circles[i][1]), circles[i][2], cv::Scalar(0, 0, 255), 3, 8, 0); 
    } 

    cv::Mat newI; 
    cv::cvtColor(hsv, newI, cv::COLOR_HSV2BGR); 

    return newI; 
} 

私には何かできることがありますか?

+0

1msは非常に短く、パフォーマンス上の問題があります。 –

+0

ああ申し訳ありませんが、これは私が試したものでした。私はもともと30msでそれを試しました。質問を編集しました。 – muXXmit2X

答えて

1

process_image関数がプログラムのボトルネックを引き起こしていると確信していても、それを変更できない場合は、本当にたくさんありません。その関数がビデオフレームの長さよりも実行に時間がかかる場合、必要なものは決して得られません。

ビデオキャプチャの品質を落とすか、サイズを小さくするのはどうですか?現時点では、1280 * 720に設定されていることがわかります。 process_image関数の処理に必要なデータが少ない場合は、より高速に処理する必要があります。

+0

Hmm。これは実際に私が思っていたものです...しかし、解像度の低下は機能しますが、結果として生じる品質も低下します。私は 'process_image'のコードにアクセスしようとします。たぶんそれは最適化することができます。 – muXXmit2X

関連する問題