質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2852閲覧

OpenCVで角度をつけた線を引きたい

mappys

総合スコア104

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/01/27 04:43

OpenCVで画像に線を引きたいのですが、角度を指定して斜めに線を描くことはできるのでしょうか?
始点と終点を指定すれば斜めに線を引くことはできると思うのですが、そのような方法ではなく、始点と長さと角度を指定して斜めの線を引きたいです。

詳しい方いましたら教えてください。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/01/27 04:57

始点と長さと角度から、三角関数を用いて終点の座標を計算することができます。
fana

2022/01/27 06:47

> 始点と終点を指定すれば斜めに線を引くことはできると思うのですが、そのような方法ではなく という話なのですから, 「終点の座標を計算して → 始点と当該計算した終点を指定することで線を引く」 ということだと条件を満たさないのでは.
mappys

2022/01/27 08:13

なるほど!ありがとうございます!
mappys

2022/01/27 08:15

fanaさま 回答ありがとうございます! fanaさまの言うとおりmelianさまの方法は求めていたこととは少し違いますが、結果的に角度と長さで決めていることになるので、計算するコードを挟む必要がありますがmelianさまの方法でやってみようと思います。ありがとうございました。
melian

2022/01/27 08:20

> fana まぁ、適当に draw_line_with_length_and_theta(start_point, l, theta) なんていう様な関数を作成すればよいのではないかな、と思います。
guest

回答3

0

ベストアンサー

以下のように、短径がゼロである楕円を書けば、角度指定で線を描くことができます。

python

1import numpy as np 2import cv2 3start_x, start_y = (256,256) 4length = 200 5img = np.zeros((512,512,3), np.uint8) 6for angle in range(0, 360, 30): 7 img = cv2.ellipse(img,(start_x,start_y),(length,0),angle,0,90,color=(255,255,255),thickness=-1) 8 9cv2.imwrite('test.png', img)

実行結果
角度による線

投稿2022/01/27 07:33

編集2022/01/27 07:34
ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/01/27 07:58

I like this.
mappys

2022/01/27 08:18

fanaさま 回答ありがとうございます! なるほど楕円を使う方法があるんですね! fanaさまのこの回答をベストアンサーにしたいのですが、回答がきていることに気づかずに自己解決で投稿してしまいました・・・ 変更できるんですかね
mappys

2022/01/27 08:21

できました。ありがとうございました!
fana

2022/01/27 10:24

この回答を書いたのは私ではなく ppaul 氏ですよ. ベストアンサーは変更できるハズです.(その手段が現在失われたりバグったりしていなければ)
guest

0

ものすごく原始的な話として,
画像上の十分な範囲を走査し,各画素に関して
「線の描画」のために画素値を変更すべきか否かを判断し,
変更すべき箇所のみを変更すれば良いのではないでしょうか.

当方,pythonできない人なので下記コードはC++になっていますが…
とりあえず

  • 線の太さを指定できる
  • ちょっとしたアンチエイリアス機能を持たせる

という感じで書いてみました.
(※走査範囲は簡便のために画像全域になっていますが,そこは必要に応じて制限すれば良いかと)
(線に太さがあるなら相応に両端を丸くしたいとか何とかいう話もあるかもですが,そこまでは考えてないです)

イメージ説明

C++

1int main() 2{ 3 //---------- 4 //入力 5 const double SX=50.88; //始点X 6 const double SY=33.172; //始点Y 7 const double Length = 77.23; //長さ 8 const double AngleDeg = 36.405; //角度[deg] 9 10 const double Thresh1 = 1.75; //線の太さ用(小さい側) 11 const double Thresh2 = 3.25; //線の太さ用(大きい側) 12 const cv::Vec3b Color{ 16,255,160 }; //線の描画色 13 14 //---------- 15 //描画先として,てきとーな広さの画像を用意 16 cv::Mat Img( 120, 160, CV_8UC3 ); 17 Img = cv::Scalar( 128, 96, 32 ); //てきとーな背景色 18 19 //---------- 20 //線を描く処理 21 const double AngleRad = AngleDeg * acos(-1.0) / 180.0; //角度[rad] 22 const double VX = cos( AngleRad ); 23 const double VY = sin( AngleRad ); 24 25 for( int y=0; y<Img.rows; ++y ) 26 { 27 double Y = y - SY; 28 double Y_VY = Y*VY; 29 double Y_VX = Y*VX; 30 cv::Vec3b *pPixel = Img.ptr< cv::Vec3b >( y ); 31 for( int x=0; x<Img.cols; ++x, ++pPixel ) 32 { 33 double X = x - SX; 34 double IP = X*VX + Y_VY; 35 if( IP<0 || IP > Length )continue; 36 37 double Dist = fabs( X*VY - Y_VX ); 38 if( Dist <= Thresh2 ) 39 { 40 if( Dist <= Thresh1 ) 41 { *pPixel = Color; } 42 else 43 { 44 double alpha = (Dist-Thresh1)/(Thresh2-Thresh1); 45 double beta = 1.0 - alpha; 46 for( int ch=0; ch<3; ++ch ) 47 { pPixel->val[ch] = cv::saturate_cast<unsigned char>( alpha * pPixel->val[ch] + beta * Color[ch] ); } 48 } 49 } 50 } 51 } 52 53 //--- 54 //結果表示 55 cv::imshow( "Result", Img ); 56 if( cv::waitKey() == 's' )cv::imwrite( "Result.png", Img ); 57 return 0; 58}

投稿2022/01/27 07:45

fana

総合スコア11663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

始点と長さと角度から、三角関数を用いて終点の座標を計算してから代入する方法でやろうと思います。

投稿2022/01/27 08:16

mappys

総合スコア104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問