私は以下の質問hereを尋ねましたが、良い解決策を得ましたが、性能はそれほど遅くないことが分かっています(640x480画像で2-300 ms)。今私はどのように最適化することができるか検討したいと思います。台形のパーセンテージマッチングを計算する最速の方法
問題:
与えられた2つのポリゴン(常にX軸に平行な台形)がある場合、どの程度一致するかを計算したいと思います。これによって、オーバーラップ領域は十分ではありません。一つのポリゴンに余分な領域があると、何らかの形でそれに対抗する必要があるからです。最適には、両方のポリゴンによって作成される面積の何パーセントが共通であるかを知りたいと思います。例えば、希望のものとして画像を参照してください。
作業(しかし遅い)溶液:
- 空の画像上にポリゴンいずれかを描画し(CV :: fillConvexPoly)
- 空の画像(CV :: fillConvexPoly)にポリゴン2を描画
- ビットを実行し、
重複全画素の画像を作成するために - すべての非ゼロピクセルをカウント - >オーバーラップピクセル
- 最初の画像を反転および非反転秒で繰り返し - >過剰画素
- Inv第二の画像ERTと非反転された第1と繰り返し - >より過大なピクセル
- あなたは現在のソリューションは、計算集約的である見ることができるように「過度のピクセルの
の合計を超える「重複ピクセル」を取ります画像の1ピクセルごとに12倍程度の評価をしているためです。私はむしろ、いくつかの画像の退屈な構成と評価を行うこの領域を計算するソリューションを望んでいます。
既存のコード:
#define POLYGONSCALING 0.05
typedef std::array<cv::Point, 4> Polygon;
float PercentMatch(const Polygon& polygon,
const cv::Mat optimalmat)
{
//Create blank mats
cv::Mat polygonmat{ cv::Mat(optimalmat.rows, optimalmat.cols, CV_8UC1, cv::Scalar(0)) };
cv::Mat resultmat{ cv::Mat(optimalmat.rows, optimalmat.cols, CV_8UC1, cv::Scalar(0)) };
//Draw polygon
cv::Point cvpointarray[4];
for (int i =0; i < 4; i++) {
cvpointarray[i] = cv::Point(POLYGONSCALING * polygon[i].x, POLYGONSCALING *
polygon[i].y);
}
cv::fillConvexPoly(polygonmat, cvpointarray, 4, cv::Scalar(255));
//Find overlapped pixels
cv::bitwise_and(polygonmat, optimalmat, resultmat);
int overlappedpixels { countNonZero(resultmat) };
//Find excessive pixels
cv::bitwise_not(optimalmat, resultmat);
cv::bitwise_and(polygonmat, resultmat, resultmat);
int excessivepixels { countNonZero(resultmat) };
cv::bitwise_not(polygonmat, resultmat);
cv::bitwise_and(optimalmat, resultmat, resultmat);
excessivepixels += countNonZero(resultmat);
return (100.0 * overlappedpixels)/(overlappedpixels + excessivepixels);
}
現在、私はそれが(それは他の多くのポリゴンに比べます)再描画ではありませんので、関数の外で「optimalmat」を描いている考案した唯一のパフォーマンスの向上、ポリゴンのサイズを変更して解像度を落としますが、パフォーマンスを向上させるためにPOLYGONSCALINGを追加しました。まだ遅すぎる。
[モンテカルロ( https://en.wikipedia.org/wiki/Monte_Carlo_inteおそらく? –
または、重複領域を計算するための数式を考え出すことができます。あなたは必要なすべての情報を持っています:台形の各点。 –
[ポリゴンブール演算](http://doc.cgal.org/latest/Boolean_set_operations_2/index.html#Boolean_set_operations_2ASimpleExample) –