c++ で OpenCV 2.4 を使用して凸状の欠陥を計算する で同様の質問を見て解決しようとしましたが、彼の解決策は私にとってはうまくいかないようです。
// Get contours
vector<vector<cv::Point> > contours;
findContours(inputMat, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
vector<vector<cv::Point> > hulls(contours.size());
vector<vector<int> > intHulls(contours.size());
vector<vector<Vec4i> > defects(contours.size());
for(int i = 0; i < contours.size(); i++){
convexHull(Mat(contours[i]), hulls[i]);
convexHull(Mat(contours[i]), intHulls[i]);
convexityDefects(contours[i], intHulls[i], defects[i]);
}
私はいつも得る:
OpenCV Error: Assertion failed (ptnum > 3) in convexityDefects, file /Users/user/slave/ios_framework/src/opencv/modules/imgproc/src/contours.cpp, line 1969
そこで、ソースをダウンロードして、contours.cpp の 1969 行を確認しました。
1965 void cv::convexityDefects( InputArray _points, InputArray _hull, OutputArray _defects )
1966 {
1967 Mat points = _points.getMat();
1968 int ptnum = points.checkVector(2, CV_32S);
1969 CV_Assert( ptnum > 3 );
輪郭ポイントのマットを作成しようとしているように見えますが、マットをチェックしています...何か?http://docs.opencv.org/には checkVectorに関するドキュメントはありませんでしたが、グーグルで検索すると次のドキュメントが見つかりました。
int cv::Mat::checkVector ( int elemChannels,
int depth = -1,
bool requireContinuous = true
) const
returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise
それを数回読んだ後、私はまだ完全に迷っており、何がこのエラーを引き起こしているのか、またはそれを修正するために何ができるのかについて確信が持てません. 私は先週、この凸性欠陥()の問題全体を自分で理解しようとしてきましたが、まったく運がありませんでした。
編集:安全のためにいくつかのことを再確認しました.
私の入力マットは、本来あるべきように、常に 100 列 x 120 行です。ただし、画面で見るのと同じくらい滑らかで連続的であると私が想定していた輪郭は、明らかにそうではありません。それらをマットに変換してサイズを確認すると、ほとんどの場合、1列×XXX行です。だから私の問題は、2次元の輪郭を取得する必要があることだと思います.それらを結合する方法はありますか? 私の画面ではシームレスに見えます。
編集2:適切なマットに輪郭を描いて渡すと、同じ「アサーションに失敗しました(ptnum> 3)」エラーが発生します。私は今何をすべきか本当にわかりません。