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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3187閲覧

Opencv HoughCircles関数について

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/08/06 09:00

編集2021/08/06 09:03

現在、Opencvを用いた円検出について学んでおり、HoughCircles関数を用いて円を検出する方法までは理解したところで疑問が湧きましたので質問させていただきます。
以下リファレンスに記載されているHoughCircles関数のサンプルプログラムです。

C++

1#include <cv.h> 2#include <highgui.h> 3#include <math.h> 4 5using namespace cv; 6 7int main(int argc, char** argv) 8{ 9 Mat img, gray; 10 if( argc != 2 && !(img=imread(argv[1], 1)).data) 11 return -1; 12 cvtColor(img, gray, CV_BGR2GRAY); 13 // 平滑化を行います.これがないと誤検出が起こりやすくなります. 14 GaussianBlur( gray, gray, Size(9, 9), 2, 2 ); 15 vector<Vec3f> circles; 16 HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 17 2, gray->rows/4, 200, 100 ); 18 for( size_t i = 0; i < circles.size(); i++ ) 19 { 20 Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 21 int radius = cvRound(circles[i][2]); 22 // 円の中心を描画します. 23 circle( img, center, 3, Scalar(0,255,0), -1, 8, 0 ); 24 // 円を描画します. 25 circle( img, center, radius, Scalar(0,0,255), 3, 8, 0 ); 26 } 27 namedWindow( "circles", 1 ); 28 imshow( "circles", img ); 29 return 0; 30}

リファレンスリンク

C++

1void HoughCircles(Mat& image, vector<Vec3f>& circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0)

パラメタ:
image – 8ビット,シングルチャンネル,グレースケールの入力画像
circles – 検出された円を出力するベクトル.各ベクトルは,3要素の浮動小数点型ベクトル (x, y, radius) としてエンコードされます
method – 現在のところ, CV_HOUGH_GRADIENT メソッドのみが実装されている.基本的には 2段階ハフ変換 で,これについては Yuen90 で述べられています
dp – 画像分解能に対する投票分解能の比率の逆数.例えば, dp=1 の場合は,投票空間は入力画像と同じ分解能をもちます.また dp=2 の場合は,投票空間の幅と高さは半分になります
minDist – 検出される円の中心同士の最小距離.このパラメータが小さすぎると,正しい円の周辺に別の円が複数誤って検出されることになります.逆に大きすぎると,検出できない円がでてくる可能性があります
param1 – 手法依存の1番目のパラメータ. CV_HOUGH_GRADIENT の場合は, Canny() エッジ検出器に渡される2つの閾値の内,大きい方の閾値を表します(小さい閾値は,この値の半分になります)
param2 – 手法依存の2番目のパラメータ. CV_HOUGH_GRADIENT の場合は,円の中心を検出する際の投票数の閾値を表します.これが小さくなるほど,より多くの誤検出が起こる可能性があります.より多くの投票を獲得した円が,最初に出力されます
minRadius – 円の半径の最小値
maxRadius – 円の半径の最大値

以上がリファレンスにあります、HoughCircles関数のパラメータですが、
質問1 : 検出時の投票数を取り出すには、どのような処理が必要でしょうか?
質問2 : 関数の出力としてvectorコンテナにx,y,半径の3要素のベクトルが出力されますが、この出力される順番は何かの規則に則っているものなのでしょうか?(例えば検出時の投票数の多い順など?)

冗長な質問で申し訳ありませんが、回答よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

OpenCVのバージョンが古いのではないでしょうか.

私が持っている ver 4.1.1 のリファレンスでは,circles の説明は以下のようになっています.

Output vector of found circles. Each vector is encoded as 3 or 4 element floating-point vector (x,y,radius) or (x,y,radius,votes)

投票値も取得できるように見えます.
出力順に関する言及は無いようですが.

投稿2021/08/06 09:30

編集2021/08/06 09:31
fana

総合スコア11708

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

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

退会済みユーザー

退会済みユーザー

2021/08/06 09:43

諸事情で3.3.0を使っておりそのリファレンスだと" Output vector of found circles. Each vector is encoded as a 3-element floating-point vector (x,y,radius) ." となっていました。3.3.0から4.1.1の間に追加されたんですね! Opencvのバージョン変更を検討したいと思います!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問