私はmatchShapes
いくつかの基本的な輪郭を認識するために使用しています。ただし、どの輪郭を比較しても0を返します...
テンプレート画像:
入力画像の例:
コード:
using std::vector;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(binary, contours, hierarchy,
CV_RETR_CCOMP, CV_CHAIN_APPROX_TC89_KCOS);
drawContours(binary, contours, -1, Scalar(255, 255, 255));
if (!contours.size()) // avoid sigsegv
return;
for (int idx = 0; idx >= 0; idx = hierarchy[idx][0]) {
double bestMatch = INFINITY;
int bestI = -1;
for (int i = 0; i < knownContours.size(); i++) {
vector<Point>& a = knownContours[i].contour;
vector<Point>& b = contours[idx];
std::cout << "a.size = " << a.size() << ", b.size = " << b.size() << std::endl;
double match = matchShapes(b, a, CV_CONTOURS_MATCH_I1, 0);
std::cout << "idx=" << idx << " ? " << knownContours[i].name << " = " << match << std::endl;
if (bestI == -1 || match < bestMatch) {
bestI = i;
bestMatch = match;
}
}
}
(knownContours
明らかに、テンプレート画像データで初期化されます: imread()
、 then findContours()
、 finally this->contour = contours[0]
)。
結果の出力(フラグメント):
-- new frame
a.size = 57, b.size = 74
idx=0 ? circle = 0
a.size = 80, b.size = 74
idx=0 ? cross = 0
a.size = 45, b.size = 74
idx=0 ? triangle = 0
a.size = 57, b.size = 60
idx=1 ? circle = 0
a.size = 80, b.size = 60
idx=1 ? cross = 0
a.size = 45, b.size = 60
idx=1 ? triangle = 0
-- new frame
a.size = 57, b.size = 75
idx=0 ? circle = 0
a.size = 80, b.size = 75
idx=0 ? cross = 0
a.size = 45, b.size = 75
idx=0 ? triangle = 0
a.size = 57, b.size = 57
idx=1 ? circle = 0
a.size = 80, b.size = 57
idx=1 ? cross = 0
a.size = 45, b.size = 57
idx=1 ? triangle = 0
-- new frame
a.size = 57, b.size = 76
idx=0 ? circle = 0
a.size = 80, b.size = 76
idx=0 ? cross = 0
a.size = 45, b.size = 76
idx=0 ? triangle = 0
a.size = 57, b.size = 51
idx=1 ? circle = 0
a.size = 80, b.size = 51
idx=1 ? cross = 0
a.size = 45, b.size = 51
idx=1 ? triangle = 0
したがって、比較される等高線のサイズは異なります (したがって、等高線は異なります) が、match == 0
常に異なります。何が起きてる?
編集: OpenCV のバージョンは 2.4.9 です (昨日複製 & ビルド)。