OpenCV Jak drukować wektory prędkości jako strzałki przy użyciu pojedynczego statycznego obrazu

Próbuję wykreślić wektory prędkości, jak w matlab, używamy funkcji „kołczan”http://www.mathworks.com/help/techdoc/ref/quiver.html

Muszę przenieść tę samą metodologię w C ++ przy użyciu biblioteki OpenCV.

Słyszałem, że istnieje kilka metod przepływu optycznego, tj. Lucas i Kanade (cvCalOpticalFlowLK) lub Horn i Schunck (cvCalOpticalFlowHS) lub metoda dopasowania bloku (cvCalOpticalFlowBM)

ale wszystkie te funkcje mają dwa obrazy, a ja muszę użyć jednego obrazu, ponieważ pracuję nad odciskami palców.

Proszę mi pomóc ...

Znaleziono [Edytuj] Rozwiązanie

<code>void cvQuiver(IplImage*Image,int x,int y,int u,int v,CvScalar Color,
                                            int Size,int Thickness){
cv::Point pt1,pt2;
double Theta;
double PI = 3.1416;

if(u==0)
    Theta=PI/2;
else
    Theta=atan2(double(v),(double)(u));

pt1.x=x;
pt1.y=y;

pt2.x=x+u;
pt2.y=y+v;

cv::line(Image,pt1,pt2,Color,Thickness,8);  //Draw Line


Size=(int)(Size*0.707);


if(Theta==PI/2 && pt1.y > pt2.y)
    {
    pt1.x=(int)(Size*cos(Theta)-Size*sin(Theta)+pt2.x);
    pt1.y=(int)(Size*sin(Theta)+Size*cos(Theta)+pt2.y);
    cv::line(Image,pt1,pt2,Color,Thickness,8);  //Draw Line

    pt1.x=(int)(Size*cos(Theta)+Size*sin(Theta)+pt2.x);
    pt1.y=(int)(Size*sin(Theta)-Size*cos(Theta)+pt2.y);
    cv::line(Image,pt1,pt2,Color,Thickness,8);  //Draw Line
  }
else{
    pt1.x=(int)(-Size*cos(Theta)-Size*sin(Theta)+pt2.x);
    pt1.y=(int)(-Size*sin(Theta)+Size*cos(Theta)+pt2.y);
    cv::line(Image,pt1,pt2,Color,Thickness,8);  //Draw Line

    pt1.x=(int)(-Size*cos(Theta)+Size*sin(Theta)+pt2.x);
    pt1.y=(int)(-Size*sin(Theta)-Size*cos(Theta)+pt2.y);
    cv::line(Image,pt1,pt2,Color,Thickness,8);  //Draw Line
    }

}
</code>

questionAnswers(3)

yourAnswerToTheQuestion