OpenCVで矢印を描画する

公開日: : 最終更新日:2014/08/14 C/C++, 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
スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

【C言語/C++】配列のまとめ

C/C++を使っていると必ず配列を使う場面が出てくると思いますが、その配列についてまとめました。C言

記事を読む

【C言語】文字列に指定の文字列が含まれるか調べる

ある文字列に指定の文字列が含まれるかどうかを調べるにはstring.hにあるstrstr関数を使いま

記事を読む

【C言語/C++】配列をシャッフルしてランダムに入れ替える

C言語・C++で配列をシャッフルする方法 Fisher–Yatesシャッフルアルゴルズムにより配列

記事を読む

【C言語/C++】fgetsを使ってファイルを読み込む

fgetsで単純にファイルを読み取る C言語、C++でfgetsを使ってファイルを読み込む方法です

記事を読む

【C言語/C++】int整数などの数値をchar配列の文字列に変換する

C++であればstringが使えて非常に便利ですが、C言語で文字列というと基本的にはcharの配列を

記事を読む

【C言語/C++】フォルダ作成を行う

C言語、C++でフォルダを作成するには『direct.h』にある『_mkdir』関数を使うことで実現

記事を読む

【C++】ファイルの読み込みまとめ

C++におけるファイル読み込みのまとめ ファイルの開き方 値の取得方法 >>演算子

記事を読む

【C言語/C++】関数ポインタと関数オブジェクトを使ってみる

関数ポインタを使う 関数ポインタはポインタの一種で文字通り関数のポインタの事で、関数を遠隔操作でき

記事を読む

【C++】多次元ベクトルクラスを作る

3次元ベクトルクラスや2次元ベクトルクラスを作るときは内部のデータとして静的な配列を使えば問題ありま

記事を読む

【C++】vectorの解放

C++STLにあるvectorは配列の要素数がわからない場合などに非常に便利ですがメモリ関係で面倒だ

記事を読む

NVIDIA DIGITSをSupervisorを使って自動起動する

はじめに 先日Ubuntu14.04にDIGITS 5をGPUなしP

【2017年度】GeForce 1080 Ti搭載BTOパソコン比較

はじめに 最近ディープラーニング用にGPUのないPCにDIGITSを

Windows用のシンプルなストップウォッチソフト紹介

Windows(10)でも使える使いやすいKAZAMITimerという

MNISTをDIGITS 5のCPUのみで試す(GPUなし)

はじめに DIGITSを使えばGUI操作で簡単にディープラーニングが

Windowsユーザが初めてMacBookを購入したときの注意点や感想

最近12インチのMacBookを購入しました。今までWindowsしか

Redmine3.2をUbuntu14.04にインストールして躓いた所についてメモ

はじめに Ubuntu14.04 ServerにRedmine3.2

UWSCを使ったソフト自動立ち上げ【SoftEther VPN Server】

やりたいこと 最近SoftEtherという筑波大学発のベンチャー企業

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑