2

Python のコードがあり、それを c++ に移植しています。drawContoursOpenCV c++ の関数で奇妙な問題が発生しています。

self.contours[i] = cv2.convexHull(self.contours[i])
cv2.drawContours(self.segments[object], [self.contours[i]], 0, 255, -1)

これは Python での関数呼び出しで、厚さパラメーターの値 -1 は輪郭を塗りつぶすために使用され、結果は次のようになります。

のように見える

私はc ++でまったく同じことをしていますが、

cv::convexHull(cv::Mat(contour), hull);
cv::drawContours(this->objectSegments[currentObject], cv::Mat(hull), -1, 255, -1);

しかし、これは結果の画像です:

画像

(ポイントをよく見てくださいconvexhull。これは簡単には見えません)。塗りつぶされたポリゴンではなく、ポイントのみを取得しています。私もfillPolylikeを使ってみました、

cv::fillPoly(this->objectSegments[currentObject],cv::Mat(hull),255);

しかし、役に立ちません。問題を解決するのを手伝ってください。私は非常に些細なことを見逃していると確信していますが、それを見つけることができませんでした。

4

1 に答える 1

1

この関数drawContours()は、各輪郭が「点のベクトル」である一連の輪郭を受け取ることを想定しています。

パラメータとして使用する式cv::Mat(hull)は、各点が個別の等高線として扱われる不適切な形式のマトリックスを返します。これが、少数のピクセルしか表示されない理由です。

cv::Mat::Mat(const std::vector<_Tp>& vec)コンストラクターに渡されるベクトルのドキュメントによると、次の方法で使用されます。

要素が行列を形成する STL ベクトル。行列には 1 つの列があり、行の数はベクトル要素の数に等しくなります。

これを考慮すると、次の 2 つのオプションがあります。

  • 作成した行列を転置します (cv::Mat::t()
  • ポイントのベクトルのベクトルを直接使用するだけです

次のサンプルは、ベクターを直接使用する方法を示しています。

cv::Mat output_image; // Work image

typedef std::vector<cv::Point> point_vector;
typedef std::vector<point_vector> contour_vector;

// Create with 1 "contour" for our convex hull
contour_vector hulls(1);

// Initialize the contour with the convex hull points
cv::convexHull(cv::Mat(contour), hulls[0]);

// And draw that single contour, filled
cv::drawContours(output_image, hulls, 0, 255, -1);
于 2016-05-17T01:16:11.100 に答える