Возможно, ошибка 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?

0 ответов

Другие вопросы по тегам