2017-04-04 9 views
0

OpenCV 3.0でC++を使用して、SimulCamの基本形式を作成しています。私が追跡したオブジェクトボールが私が描いた線を横切るかどうかを見つけるにはどうすればよいですか?

現在、オブジェクトボールが出力ウィンドウに描画された線と交差/交差しているかどうかを確認する方法を見つけることに取り組んでいます。

球は輪郭を使用して追跡されており、最終的にはこの交差が起こる正確なフレーム番号を調べたいと思います。

まず、オブジェクトボールが描画された線と交差/交差したかどうかを確認する方法を理解したいと思います。

Scene with ball moving towards line

私はオブジェクトの輪郭を持って、私は交差点のチェックを実行する方法を理解したいと思います。

コード輪郭を見つけ、オブジェクトトラッキングのために:

findContours(resizedThresh, contourVector, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 

contourVector.resize(contourVector.size()); 

line(resizedF_Fast, Point(300, 0), Point(300, 360), Scalar(255), 2, 8); 
for (size_t i = 0; i < contourVector.size(); i++) { 

    approxPolyDP(Mat(contourVector[i]), contourVector[i], 0.01*arcLength(contourVector[i], true), true); 
    double area = contourArea(contourVector[i]); 

    if (contourVector[i].size() > 5 && (area > 200)) { 
     ++circlesC; 
     drawContours(resizedF_Fast, contourVector, i, Scalar(255, 255, 255), 2, CV_AA, hierarchy, abs(1)); 
     searchForMovement(resizedThresh, resizedF_Fast); 
    } 
} 

を私は他のいくつかの研究を行っている、と私はlineIteratorを使用してに探してきたが、私は全くわかりません。

潜在的な原油コードの謝罪、初心者はここに。どんな助けでも大歓迎です。

+0

ラインはどのように定義されていますか?それは常に垂直かそれは何でもかまいませんか? – Sunreef

+0

この場合、線は常に垂直です。さらにラインを下ろすと、フレームから抽出されたフィーチャ、すなわち風景などの開始フィニッシュラインに変化する。 – AnthonyGR1

答えて

0

私は最終的にこれを使って作業しましたが、一般的な考えをここに掲載します。

各フレームについて、オブジェクトの輪郭を計算します。

  • 各輪郭は、xを有し、yはラインの全ての値を循環する(例えばlineIt)

LineIteratorを使用し保存された座標。

if (xpos_contour < lineIt.pos().x) { 
    // Object is on the left of the line 
} 
else if (xpos_contour > lineIt.pos().x) { 
    // Object is to the right of the line 
} 

入力ビデオimは撮影されたトップダウンを使用しているので、x座標のみが重要です。

0

私の最初のアプローチは、輪郭点に円を当て、線と円の中心との距離を内積で計算することです。多分これ(didntはそれを試してみた)のように:あなたの距離マイナスサークル半径が小さいゼロであれば

Point Pc; // circle center 
Point L0(300,0); 
Point L1(300,360); 

double v[] = {L1.x-L0.x,L1.y-L0.y}; 
double w[] = {Pc.x-L0.x,Pc.y-L0.y}; 

Mat v(1,2,CV_32F,v); 
Mat w(1,2,CV_32F,w); 

double c1 = w.dot(v); 
double c2 = v.dot(v); 
double b = c1/c2; 

Mat Pb = L0 + b * v; 
double distance = norm(Pc,Pb); 

次に、あなたがチェックします。

しかし、あなたのカメラの遠近法変換のためにボールは楕円になり、私の前提はあまり正確になりません。

より正確なソリューションが必要な場合は、すべての輪郭点を確認し、最小距離を取る必要があります。

This linkは、いくつかのコードとそれ以上の説明を示しています。

0

チェックthisチュートリアル。彼はオブジェクト(彼の場合は車)がラインを横切っているかどうかをチェックするためにそれを示します。

関連する問題