polygonを形成する頂点列からボロノイ図を作成する

テキスト形式で保存された、polygonを形成する頂点列から、ボロノイ図を作成する。初めに入力とする座標データ、次に生成結果の画像(入力図形のダンプや、結果のボロノイ図)、最後に使用したコードを示す。

Create a Voronoi diagram from a vertex sequence that forms a polygon, saved in text format. The first coordinate data input, the resulting image (input figure dump, result Voronoi diagram), and the last used code are shown.

■input point list(x-y coodinate)
-125.458 131.465
-125.474 135.003
-122.966 135.026
-122.974 132.982
-123.492 132.974
-123.516 134.484
-124.011 134.492
-123.988 133.981
-124.515 133.981
-124.491 133.454
-125.026 133.477
-125.018 131.968
-124.459 131.992
-124.53 132.99
-124.019 132.982
-123.98 132.518
-122.769 132.503
-122.785 135.482
-125.513 135.522
-125.521 135.986
-119.97 135.986
-119.947 133.477
-120.442 133.485
-120.442 131.496
-121.527 131.473
-121.535 133.485
-121 133.485
-121.016 134.468
-120.505 134.468
-120.497 135.506
-121.511 135.506
-121.488 133.981
-122.006 133.981
-121.999 131.512
-125.458 131.465

■output picture
001_pattern_contour.png(input pattern)
001_pattern_contour.png

002_point_marker.png(after split long edge points)
002_point_marker.png

003_delaunay_traiangle.png
003_delaunay_traiangle.png

004_voronoi.png
004_voronoi.png



■sample code



上記の関数では、頂点列で表すPolygon図形を構成するエッジのうち、任意の長さ以上のエッジに対して分割し頂点を増やすことを行う
In the above function, divide the edges of arbitrary length out of the edges constituting the polygon figure represented by the vertex sequence and increase the number of vertices.input first argument is ndarray(xy point list),second is split length. If distance between two points constituting an edge far than this length, add new point at between two point, and split long edge.



上記の関数では、生成するボロノイ図の画像データのに合わせて、頂点列の座標を変換(倍率変換)している。2つ目引数に指定した値が生成画像の横幅となる。戻り値は配列となっており、一つ目は変換結果のndarray,2つ目は画像の高さ。
In the above function, the coordinates of the vertex sequence are converted (magnification conversion) in accordance with the image data of the generated Voronoi diagram. The value specified for the second argument is the width of the generated image.The return value is an array, the first is the ndarray of the conversion result, the second is the height of the image.

頂点列で表すPolygonを構成する長いエッジに対しエッジ分割し、頂点を追加する。

頂点列で表すPolygon図形を構成するエッジのうち、任意の長さ以上のエッジに対して分割し頂点を増やす処理。

Process of dividing vertices of arbitrary length and increasing vertex among edges constituting Polygon figure represented by vertex sequence.

(results sample picture)
@red points : Polygon points
@blue pattern : Filled polygon
before
before split edge
after
after split edge

(results split edge)
original_points
[[237.894 0. ]
[130.554 105.408]
[ 43.748 0.626]
[ 0. 42.589]
[129.559 189. ]
[280. 42.589]
[237.894 0. ]]

after split points
[[237.894 0. ]
[184.224 52.704 ]
[130.554 105.408 ]
[ 87.151 53.017 ]
[ 43.748 0.626 ]
[ 0. 42.589 ]
[ 64.7795 115.7945 ]
[129.559 189. ]
[179.706 140.19633333]
[229.853 91.39266667]
[280. 42.589 ]
[237.894 0. ]]

sample code

■polygon_points.txt
237.894 0.000
130.554 105.408
43.748 0.626
0.000 42.589
129.559 189.000
280.000 42.589
237.894 0.000

Add x-y vertex coordinates to empty numpy.ndarray

頂点座標を空のnumpy.ndarrayに追加する操作。
よくやるのでメモ。

—(sample code)—–

—(exec result)—–
[[-126 133]
[-126 131]
[-117 131]
[-117 134]]

—(memo)—-
initialize ndarray for x-y point list.
at first array is empty(no entry) and add_type is [x,y].
so initialize parameter is (0,2).

if append for ndarray, append element must ndarray.
we use only 1 axis, so axis = 0(axis memo)

Voronoi diagram(ボロノイ図)

voronoi diagram sample

opencvのHOGDescriptorとSVM(getDaimlerPeopleDetector)で人検出

getDaimlerPeopleDetectorを使っての人検出。getDefaultPeopleDetectorを使った人検出は
こちら。

■入力画像
HOGDescriptor_getDaimlerPeopleDetector input

■サンプルコード

■実行結果
HOGDescriptor_getDaimlerPeopleDetector output

誤検出はあるが、getDefaultPeopleDetectorでの検出に比べると漏れは少なくなる印象。

opencvのHOGDescriptorとSVMで人検出

HOGDescriptorは被探索画像を64 * 128 などの単位でスキャンし、8 * 8などのピクセルを移動させてHOG特徴量の抽出を行う。HOG特徴量は領域内の勾配方向ごとの勾配強度を計算してそれをヒストグラムにしたものらしい。画像中の輝度変化を抽出していることになる。

SVMは入力が正解か不正解を分類する分類器。大量のデータとラベルの組から正解ラベルのデータ、不正解ラベルのデータを学習し正解と不正解の境界線を引く。

opencvにはすでに学習済みの人識別器が同梱されており、これを使って人の検出を行ってみる。

■入力画像
HOGDescriptor_getDefaultPeopleDetector input

■サンプルコード

■実行結果
HOGDescriptor_getDefaultPeopleDetector input

検出漏れはあるが、とりあえず機能はしている様子。opencvの人認識器には今回試したgetDefaultPeopleDetector以外にgetDaimlerPeopleDetectorという認識器が同梱されている。これについては次回以降で実験してみる。

HOG Descriptor scans the search image by units such as 64 x 128, moves pixels such as 8 x 8, and extracts the HOG feature amount. It seems that the HOG feature quantity is calculated by calculating the gradient strength for each gradient direction in the region and making it a histogram. The luminance change in the image is extracted.

SVM is a classifier that classifies incorrect answers or incorrect answers. Learn the data of the correct label and the data of the incorrect label from the large amount of data and the set of labels and draw the boundary line between the correct answer and incorrect answer.
Opencv is already shipped with a learned person identifier, and try to detect people using it.

Results:Detection is insufficient, but it seems that it is functioning for the time being. In this time, we tried getDefaultPeopleDetector on human recognition device of opencv and recognition device called getDaimlerPeopleDetector is bundled. I will experiment about this next time.

opencvを使いHarrisコーナー検出で画像からコーナー部を抽出する

コーナー部の特徴量抽出をする方法としてMoravecの方法や、Harrisの方法というものがある。検出のためのアルゴリズムは難解で自分には理解できず。とりあえず実行テストした結果とコードを乗せる。しっかりとコーナー部分を抽出できていることがわかる。

■入力画像
corner detect sample input

■サンプルコード

■実行結果
detect corner by harris

opencvを使いcanny法で画像をエッジ変換する

■サンプルコード

■実行結果
canny test

opencvを使いハフ変換で画像から円を探す(HoughCircles)

HoughCircles(image, circles, method, dp, minDist, param1, param2, minRadius, maxRadius)

ハフ変換を用いて画像内から円を検出する

項目 内容
image 8ビット,シングルチャンネル,グレースケールの入力画像
circles 検出された円を出力するベクトル
method 現在のところCV_HOUGH_GRADIENT メソッドのみが実装
dp 画像分解能に対する投票分解能の比率の逆数
minDist 検出される円の中心同士の最小距離.このパラメータが小さすぎると,正しい円の周辺に別の円が複数誤って検出される
param1 手法依存の 1 番目のパラメータ. CV_HOUGH_GRADIENT の場合は, Canny() エッジ検出器に渡される2つの閾値の内,大きい方の閾値を表す
param2 手法依存の 2 番目のパラメータ. CV_HOUGH_GRADIENT の場合は,円の中心を検出する際の投票数の閾値を表す.これが小さくなるほど,より多くの誤検出が起こる可能性がある
minRadius 円の半径の最小値
maxRadius 円の半径の最大値

■入力画像
houghcircles test

■処理コード

■結果
houghcircles test

opencvを使い確率的ハフ変換で画像から直線を探す

ハフ変換は与えられたパラメータから全条件を計算し直線を求めるのに対し、確率的ハフ変換はある程度の当たりをつけて計算し、負荷を軽くする。

HoughLinesP(image, lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0)

■入力画像
houghline test

■処理コード

■結果
houghline test