Возможно, ошибка MatIterator_ в интересующей области

Я работаю с некоторым обнаружением объектов, используя OpenCV 2.4.4 с C ++. К сожалению, те объекты, которые я должен обнаружить, не имеют уникальной формы, но у них действительно есть определенный диапазон цветов в цветовом пространстве HSV (сейчас я обнаруживаю некоторые красные объекты).

Кроме того, объект должен присутствовать только в некоторой части изображения, поэтому я не сканирую все изображение, более того, под этой областью интереса у меня есть вспомогательные области интереса (маленькие прямоугольники, и мне нужно знать, в каком из этих прямоугольников объект находится в рамке).

Итак, сначала я попытался обнаружить, что что-то было найдено в большом ROI, и если это было так, я установил для него какой-то цвет, чуждый моему окружению. Я сделал это с помощью следующего кода:

cvtColor(frame(Range(0,espv),Range::all()),framhsv,CV_BGR2HSV);
MatIterator_<Vec3b> it, ith, end, endh;
ith  = framhsv.begin<Vec3b>();
endh = framhsv.end<Vec3b>();
it   = (frame(Range(0,espv),Range::all())).begin<Vec3b>();
for (;ith != endh; ++it,++ith){
if( (((*ith)[0] <=7 && (*ith)[0]>=0)||((*ith)[0]>170)) && (*ith)[1]>=160){
(*it)[0] = 63;
(*it)[1] = 0;
(*it)[2] = 255;}}

Все работало правильно, и объект был «обнаружен», поэтому я перешел к следующему крутому кругу, который обнаруживает, находился ли объект в каждой под-области интереса. Для этого я создал следующую функцию, которая возвращает количество «обнаруженных» пикселей в каждой вспомогательной области интереса, поэтому я могу рассмотреть, какая из них является правильной вспомогательной областью интереса.

Вот функция:

Vector<int> CountRed(cv::Mat &frame, int hspa, int vspa, int nlines ,int nblocks){
Vector<int> count(nblocks*nlines,0);
for(int i = 1; i<= nlines; i++){
for(int j = 1; j<= nblocks; j++){

Mat framhsv;
cvtColor(frame(Range((i-1)*vspa,i*vspa),Range((j-1)*hspa,j*hspa)),framhsv,CV_BGR2HSV); //Converte somente a área de interesse para HSV

MatIterator_<Vec3b> it, ith, endh;
ith  = framhsv.begin<Vec3b>();
endh = framhsv.end<Vec3b>();
it   = (frame(Range((i-1)*vspa,i*vspa),Range((j-1)*hspa,j*hspa))).begin<Vec3b>();

for (;ith != endh; ++it,++ith){
if( (((*ith)[0] <=7 && (*ith)[0]>=0)||((*ith)[0]>170)) && (*ith)[1]>=160){
(*it)[0] = 63;
(*it)[1] = 0;
(*it)[2] = 255;
count[(j)+nblocks*(i-1)-1]++;}}}}
return count;
}

Код компилируется без предупреждений или ошибок, и появляется видео, но если я вставляю объект, который должен обнаружить в любой части ROI, код перестает работать, это также происходит, если я удаляю:

count[(j)+nblocks*(i-1)-1]++;

линия. Я получаю следующую ошибку:
Access violation writing location 0xFFFFF970.

Я действительно думаю, что проблема заключается в доступе к итератору, когда он не используется Range::All()

Чтобы попытаться уточнить, что я здесь делаю, это изображение рамки:
http://i.imgur.com/Irvr8bk.jpg

фиолетовая область — это рамка, красная область — область интереса, а каждая из черных — вспомогательная область интереса.

Я также пытался использовать frame(Rect(0,0,frame.cols,2*vspa) определить рентабельность инвестиций, и это также сработало, но я получил ту же ошибку при попытке работать с суб-ROI, используя cv::Rect, Итак, я действительно думаю, что это должно быть MatIterator_ ошибка при отсутствии доступа к полной структуре строки.

Итак, что я должен сделать, чтобы работать с этими суб-ROI?

2

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы [email protected]