findContours, contourArea выдают ошибки с вложенными контурами. «Ошибка подтверждения», «входной массив не является допустимой матрицей»

Я пытаюсь найти самый большой контур в бинарном изображении. Судя по этот вопрос а также этот урок Вы думаете, это тривиально, и я согласен. Когда я запускаю свой код на изображение ниже хотя, это выдает ошибки. Обратите внимание на точку 2×2 в верхнем левом углу, которая должна считаться одним контуром.

problem.png

Mat img = imread("problem.png", CV_LOAD_IMAGE_GRAYSCALE);
vector<vector<Point>> ContourVector;
findContours(img, ContourVector, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
//findContours(img, ContourVector, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);    // Alternative mode

int biggest = 0;
double BiggestContourArea = contourArea(ContourVector[biggest]);
for (int i = 1; i != ContourVector.size(); ++i){
if ( (contourArea(ContourVector[i])) > BiggestContourArea) {
biggest = i;
BiggestContourArea = contourArea(ContourVector[biggest]);
}
}
img = Scalar(0,0,0);
drawContours(img, ContourVector, biggest, Scalar(255,255,255), CV_FILLED );
imshow("Largest contour", img);
waitKey(0);

Если используется режим CV_RETR_LIST, я получаю эту ошибку при i = 3, хотя ContourVector имеет размер 4. Почему вектор будет больше, чем число контуров?

"Assertion failed: (0 <= contourIdx && contourIdx < (int)last) in unknown function, file ..[..]contours.cpp, line 1810"

Если используется режим CV_RETR_EXTERNAL (что более логично), я получаю эту ошибку. Почему это случилось

OpenCV Error: Bad argument (input array is not a valid matrix)  in unknown function, file ..[..]utils.cpp, line 54

Буду признателен, если кто-нибудь сможет объяснить эти ошибки.

Мне также интересно, почему результат contourArea внутри цикла по какой-то причине равен 0, а ContourVector [i] .size () дает абсурдно большое число (около 4 миллиардов).

2

Решение

Я не могу судить по делу CV_EXTERNAL. Но в первом случае проблема кажется простой.

for (int i = 1; i != ContourVector.size(); ++i){
if ( (contourArea(ContourVector[i])) > BiggestContourArea) {
biggest = i;
BiggestContourArea = contourArea(ContourVector[biggest]);
}
}

В C ++ массивы и векторы индексируются с нуля. Итак, первый элемент в векторе имеет индекс 0и последний имеет ContourVector.size() - 1,

Чтобы исправить код, просто измените цикл for на:

for (int i = 1; i < ContourVector.size(); ++i)    ....
0

Другие решения

Похоже, что это проблема совместимости с Visual Studio 2012 и предварительно собранными библиотеками, предоставляемыми OpenCV. После того, как я установил и использовал Visual Studio 2010 для запуска кода, проблемы исчезли.

Я предполагаю, что вы также можете решить эту проблему, создав OpenCV из исходного кода с VS 2012, но мне не удалось. Есть мануал Вот, но он устарел (в git нет директории с исходным кодом).

У меня были и другие странные проблемы с этим проектом в VS 2012, которые соответствуют некоторым библиотекам. Компиляция кода работала нормально в режиме отладки и выпуска, но выполнение его дало ошибку в режиме отладки. В режиме релиза это казалось работать, но это привело к ошибкам, таким как та, которая вызвала этот вопрос.

Для протокола я связал «/ build / x86 / vc10 / lib» в качестве дополнительного каталога библиотеки в VS 2012, и ошибки были вызваны версиями OpenCV 2.4.4–2.4.6.

0

В ответ на ваше последнее сообщение (похоже, это была проблема совместимости …), вы пытались использовать «/ build / x86 / vc11 / lib» вместо vc10 для VS 2012? Я ни в коем случае не эксперт, но это может быть несовпадением библиотек. (vc11 определенно в 2.4.6 openCV, не уверен до этого)

дон
Хорошего дня

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector