次の画像のピーク (x 軸) の位置が検出されます
画像が垂直の場合、CvMinMax を適用してピークを見つけます。しかし、ここは水平なので苦労しています。CvMinMax を使用してこのピークを特定する方法はありますか? (画像を回転させたくない)
最後のオプションとして、各列を検索する必要がありますが、これは非常にコストがかかるため、実行したくありません。そのようなピークを検索する最適化された方法はありますか?
次の画像のピーク (x 軸) の位置が検出されます
画像が垂直の場合、CvMinMax を適用してピークを見つけます。しかし、ここは水平なので苦労しています。CvMinMax を使用してこのピークを特定する方法はありますか? (画像を回転させたくない)
最後のオプションとして、各列を検索する必要がありますが、これは非常にコストがかかるため、実行したくありません。そのようなピークを検索する最適化された方法はありますか?
行ごとに画像のピクセルにアクセスし、単純な距離アプローチを使用します。そのためのコードも必要ないことを願っています。
高速な方法は次のとおりです。
cv.Reduce
。これにより、列の合計のベクトルが得られます。cv.MinMaxLoc
左から見つけた最初の最小値と最初の最大値の位置を報告するを使用します (画像はバイナリであるため、ゼロ以外の最初の値が得られます)。ここでは Python で実装されています。これらはすべて組み込みの opencv 関数であるため、C に変換するのは非常に簡単です。
def find_left_max4(im):
sums = cv.CreateImage((im.width, 1), cv.IPL_DEPTH_32F, 1)
cv.Reduce(im, sums, dim=0, op=cv.CV_REDUCE_SUM)
cv.Threshold(sums, sums,200, 255, cv.CV_THRESH_BINARY)
cv.Flip(sums, flipMode=1)
return sums.width - cv.MinMaxLoc(sums)[3][0] - 1
im = cv.LoadImage('zfUHp.jpg',cv.CV_LOAD_IMAGE_GRAYSCALE)
print find_right_max4(im)
#Output:
324
このアプローチをスピードで打ち負かすことはできないと思います。私の遅いコンピューターでは、54 µs でクロックインします (以前の投稿よりも 10 倍高速です)。