いくつかのオブジェクトを検出したいビデオを処理しています。不要な輪郭をフィルタリングする - opencv with C++
最初に、背景を削除してから、それを灰色にしてcv::threshold
とそれ以降のcv::findcontours
を使用して2値画像を作成します。
輪郭が長すぎたり短すぎたりします。 "Opencv 2 cookbook"にこのような理由でコードが見つかりました。しかし、それは私のビデオの21番目のフレームで実行時エラーがあります。
// Eliminate too short or too long contours
size_t cmin{ 15 }; // minimum contour length
size_t cmax{ 120 }; // maximum contour length
std::vector<std::vector<cv::Point> >::
const_iterator itc = contours.begin();
while (itc != contours.end()) {
if (itc->size() < cmin || itc->size() > cmax)
itc = contours.erase(itc);
else
++itc;
}
私が検索し、見つかった別のコードを、それは同じフレームで同じエラーがあります。
double min_area = 500; // area threshold
double max_area = 1500; // area threshold
for (int i = 0; i < contours.size(); i++) // iterate through each contour.
{
double area = contourArea(contours[i], false); // Find the area of contour
if (area < min_area || area > max_area)
contours.erase(contours.begin() + i);
}
と私は新しいベクトルを作成して、それで受け入れられた輪郭をコピーするコードを書きました。それはまた、同じフレームで同じエラーが発生しました:
std::vector<std::vector<cv::Point> > goodcontours;
size_t cmin{ 15 };
size_t cmax{ 120 };
double contourlength = 1;
size_t contoursize = contours.size();
for (int i = 0; i != contoursize;i++) {
contourlength = cv::arcLength(contours[i], true);
if (contourlength > cmin && contourlength < cmax)
goodcontours.push_back(contours.at(i));
}
私は他の動画を試してみましたが、それらのすべてが特定のフレームで同じ問題を抱えています。
エラーが発生する前に、私は依然として不要な輪郭を見ることができ、実際には除去されないことを意味します。
エラーがちょうど言う:0x75017FB2で
未処理の例外(ucrtbase.dll)
あなたが輪郭をフィルタリングするための任意の提案を持っていますか?
one of my video frames contours
私は**それは 'contourAreaに一致していない輪郭に関係していること**推測'仮定(おそらく小さすぎる?)。いくつかの詳細な情報メッセージが必要です - もっと慎重に見てください – slawekwin