5

最適化が必要なコードを書きました。コミュニティに確認して、そのコードが本当に最適かどうかを確認したいだけです。ハフ変換のアキュムレータがいっぱいになります。実際には、OpenCV ライブラリからほとんどのコードをコピーして貼り付けただけです。ありがとう!


int i,j,n,index;
for (i = 0;i<numrows;i++)
{
    for (j = 0;j<numcols;j++)
    {
            if (img[i*numcols + j] == 100)
        {
            for (n = 300;n<600;n++)
            {   
                index = cvRound(j*tabCos[n] + i * tabSin[n]) + (numrho-1)/2;
                accum[(n+1) * (numrho+2) + index+1]++;
            }
        }
    }
}
4

3 に答える 3

2

私も漠然と付け加えているコードの一部に、大きくて反復的なハフ変換があります。コードのその部分のメンテナはstd::map、アキュムレータのスパース配列(実際にはセルインデックスにキーが設定されたC ++)を実験しており、ある程度の成功を収めています。

スピードアップはキャッシュの局所性の問題に関連していると思いますが、それは確かにデータまばらであることに依存します。


更新:上記で参照されているソフトウェアは、多くの素粒子物理学実験を提供することを目的としていますが、元々はテストベッドプロジェクト(つまり小規模)で使用されていました。大規模なプロジェクトの実行に真剣に取り組み、モンテカルロを実行し始めたため、スパース行列を使用した場合でも、ハフ変換は再びボトルネックになりました。

まだ解決策はありませんが、同僚の1人が、「高速ハフ変換」を含むガンダルフを見つけました。これは、四分木に似た方法で変換を評価しているように見えます(2Dでは、おそらく3Dで八分木を使用します)。作業の順序を減らすため。おそらくこれを試してみるつもりです。

さらなる更新:同僚が最終的にコードにプログレッシブで確率的なハフ変換を実装しました。これは現在、私たちが入手した中で最速のバージョンのようです。すべてのポイントをラインに割り当てる必要がない場合に最適に機能します。

于 2010-11-19T19:27:59.037 に答える
1

いいえ、ちがいます。[]問題の配列を反復するために、単純なポインター演算でできるだけ多くの使用法を置き換えます。不変式をローカル変数に抽象化します。

ただし、最初の質問は、このコードがアプリ全体のコンテキストでボトルネックであることをプロファイラーが示しているかどうかです。そうでない場合、なぜこれをマイクロ最適化する必要があるのでしょうか?

編集: ループのマイクロ最適化 - 配列のインデックス作成が不要なため、2 番目を優先します (複数対追加)

int ints[100];
int i;
int *pi;

for (i = 0; i < 100; ++i)
{
  printf("%d", ints[i]);
}

for (pi = ints; pi < ints + 100; ++pi)
{
  printf("%d", *pi);
}
于 2010-11-19T19:23:42.987 に答える
0

アプリケーションによっては、ハフ変換を最適化する方法が多数あり、低レベルのコードをいじるのはおそらく最後の方法です。ランダム化HTまたは多重解像度HTから始め、ハイブリッドアプローチのマージを行います。最初にアルゴリズムを最適化する方が良いと思います。最後のステップは、CADメモリのようなハードウェア最適化を使用することです。

于 2010-11-20T13:03:36.067 に答える