2

パフォーマンス上の理由から、最新のプロジェクトで OpenCV in C を画像処理ツールとして使用しています。Open CV を使用しているときに、Open CV では行列演算のライブラリ サポートが少ないことがわかりました。たとえば、行列のすべての列に列ベクトルを追加したい場合、これを行うカスタム関数を作成する必要があります。Matlab では些細に見え、Open CV では欠落している操作が他にもたくさんあります - 各列のノルム、列ごとの最小/最大などのように。ライブラリの行列操作のサポートは非​​常に最小限です。これはライブラリの設計上の決定ですか、それともこれを通じて私を助けることができるある種の拡張機能があります. サポートの欠如を観察し、何かをした人がいたに違いないと思います。

4

1 に答える 1

3

OpenCV は MatLab の完全な代替品ではないかもしれませんが、その行列サポートは依然として非常に優れています。探している機能のいくつかはそこにあるのに、単に名前が異なるだけであることに気付くかもしれません。

たとえば、行列のすべての列に列ベクトルを追加したい場合、これを行うカスタム関数を作成する必要があります。

これにはいくつかの方法があります。おそらく最も簡単なのは範囲を使用することです。1 つの解決策については、以下を参照してください。

各列のようなノルム

行列の範囲を使用して、ループ内の各列を選択します。

cv::Mat m;

// ...

for (unsigned c = 0; c < m.cols(); c++)
{
    cv::Mat col(m, cv::Range::all(), cv::Range(c, c+1));
    double n = cv::norm(col, NORM_L2);
}

列ごとの最小/最大など

関数は、これらすべての種類のcv::reduce機能を提供します。

cv::reduce(InputArray src, OutputArray dst, int dim, int rtype);
// where rtype = CV_REDUCE_MIN, CV_REDUCE_MAX, etc

要するに、行列に対するすべての列単位の操作が Open CV に欠けているようです (もっと見つけられなかったら驚くでしょう)。

cv::reduce()合計と平均も実行します。列単位または行単位で実行することを選択できます。これらの操作がニーズに十分でない場合は、実際に独自の関数を作成する必要がある場合があります。

オンライン ドキュメントは非常に優れています。

チュートリアルには、メモリ管理と行列に関する詳細情報があり、特に範囲とこれがメモリを共有する方法について説明しています。

于 2013-10-05T07:09:44.577 に答える