【发布时间】:2017-04-27 08:51:43
【问题描述】:
我正在处理一个视频,我想检测一些对象。
首先,我删除背景,然后将其设为灰色并使用cv::threshold 制作二值图像,然后使用cv::findcontours。
我想删除太长和太短的轮廓。 为此,我在“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) 处未处理的异常
你对过滤轮廓有什么建议吗?
【问题讨论】:
-
我猜测这与不符合
contourArea假设的轮廓有关(也许太小了?)。必须有一些更详细的信息消息 - 仔细查看