OpenCVで矢印を描画する
スポンサーリンク
OpenCVで矢印を描画するという関数が無いみたいだったので作りました。書いていることは参考リンク先のをOpenCV用に直しただけなので、正直リンク先見た方が参考になります。
void cvArrow(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int lineType=8, int shift=0) { cvLine(img,pt1,pt2,color,thickness,lineType,shift); float vx = (float)(pt2.x - pt1.x); float vy = (float)(pt2.y - pt1.y); float v = sqrt( vx*vx + vy*vy ); float ux = vx / v; float uy = vy / v; //矢印の幅の部分 float w=5,h=10; CvPoint ptl,ptr; ptl.x = (int)((float)pt2.x - uy*w - ux*h); ptl.y = (int)((float)pt2.y + ux*w - uy*h); ptr.x = (int)((float)pt2.x + uy*w - ux*h); ptr.y = (int)((float)pt2.y - ux*w - uy*h); //矢印の先端を描画する cvLine(img,pt2,ptl,color,thickness,lineType,shift); cvLine(img,pt2,ptr,color,thickness,lineType,shift); } int main(void) { IplImage *img = cvCreateImage(cvSize(100,100),IPL_DEPTH_8U,3); //白く初期化する for(int i=0;i<100*100*3;i++){ img->imageData[i] = 255; } //青い矢印を描画 cvArrow(img,cvPoint(10,10),cvPoint(90,90),cvScalar(255,0,0)); cvNamedWindow("arrow",CV_WINDOW_AUTOSIZE); cvShowImage("arrow",img); cvWaitKey(0); cvReleaseImage(&img); cvDestroyWindow("arrow"); return 0; }

cvArrowという関数が矢印を描画する関数で、cvLineと引数を同じにしましたが、矢印の幅を引数にしてみるのもいいかもしれません。
『矢印をプログラムで描く;単純ベクトル加算法』
http://k-hiura.cocolog-nifty.com/blog/2010/11/post-2a62.html
http://k-hiura.cocolog-nifty.com/blog/2010/11/post-2a62.html
スポンサーリンク