2016-04-12 7 views
0

У меня мало проблем с индексацией со следующим циклом. Просто я просматриваю изображение с помощью roi, но я не могу сканировать все изображение. У меня есть некоторые незасканированные области, оставшиеся в последних строках и столбцах. Любое предложение? Извините за простой вопрос.Скользящее окно с roi C++

`

// Sliding Window for scaning the image 
for (int rowIndex = 0; rowIndex <= lBPIIImage2.rows - roih; rowIndex = getNextIndex(rowIndex, lBPIIImage2.rows, roih, steprow)) 

{ 
    for (int colindex = 0; colindex <=lBPIIImage2.cols - roiw; colindex = getNextIndex(colindex, lBPIIImage2.cols, roiw, stepcol)) 

    { 
     searchRect = cvRect(colindex, rowIndex, roiw, roih); 
     frameSearchRect = lBPIIImage2(searchRect); 
     LoopDummy = frameSearchRect.clone(); 
     rectangle(frame, searchRect, CV_RGB(255, 0, 0), 1, 8, 0); 
     //normalize(LoopDummy, LoopDummy, 0, 255, NORM_MINMAX, CV_8UC1); 
     //imshow("Track", LoopDummy); 
     //waitKey(30); 
     images.push_back(LoopDummy); 
     Coordinate.push_back(make_pair(rowIndex, colindex)); 
    } 

} 
+0

Почему существуют оба типа «roiw» и «StepRow», в чем разница между ними? – Dialecticus

+0

Я скользя с перекрывающимися окнами, поэтому у меня есть шаг. это roiw/.5 –

+0

OK, так что бы вы хотели, чтобы последний 'cvRect' в строке также имел ширину' roiw', но 'rowIndex% StepRow' был! = 0, или вы бы хотели бы' rowIndex% StepRow' должно быть 0, но ширина 'cvRect' будет меньше, чем' roiw'? – Dialecticus

ответ

0

Вместо этого

for (int rowindex = 0; rowindex <= frameWidth - roiw; rowindex += StepRow) 

попробовать что-то вроде этого

for (int rowIndex = 0; rowIndex < frameWidth - roiw; 
    rowIndex = getNextIndex(rowIndex, frameWidth, roiw, StepRow)) 

где функция getNextIndex как это:

int getNextIndex(int currentIndex, int frameSize, int roi, int step) 
{ 
    int temp = min(currentIndex + step, frameSize - roi - 1); 
    return currentIndex != temp ? temp : frameSize; 
} 

Обратите внимание, что я заменил <= на < в состоянии части цикла. Мне разумно изменить этот бит. В моих комментариях значения индекса должны быть 0,5,6, а не 0,5,7. Если это действительно должно стоять <=, то просто удалите часть - 1 выше.

+0

Намного лучше, спасибо. Im потери очень мало непокрытых пикселей, которыми можно пренебречь. –

+0

Я верю, что '<=' должен оставаться в состоянии и '- 1' отбрасываться - если последняя область выровнена с концом изображения, она будет охватывать' [(frameSize - roiw), (frameSize - 1) ] 'interval, который охватывает точно целые числа roiw. Для ошибок «один за другим» мой трюк состоит в том, чтобы попробовать угловой футляр. Если 'frameWidth' равно' roiw', в этом случае у вас ровно 1 сканирование, при текущем условии вы вообще не будете вводить петлю. – mcmlxxxvi

+0

Я столкнулся с проблемой сегодня, когда размер шага очень низок, я имею в виду один пиксель в каждой координате, код сканирует дополнительные регионы. Обычно средние части изображения. –

0

Dialecticus имеет problem covered, но хотел бы немного рассказать другу. Проблема, как вы заметили, затрагивает как строки, так и столбцы, но я буду говорить только о ширине, так как обработка высоты аналогична.

Части массива или диапазона, не повторенные контуром, особенно в конце, являются типичным признаком того, что условие цикла и/или приращение не охватывают весь массив/диапазон и требуют регулировки. В вашем случае для сканирования всей ширины изображения вам нужно будет frameWidth - roiw, чтобы быть точным числом StepRow s, то есть (frameWidth - roiw) % StepRow == 0. Я сильно подозреваю, что это не так в вашем случае.

Например, если изображение на 14 пикселей в ширину, и ваш регион шириной интерес представляет 8, в этом случае ваш шаг would be 4 pixels (я предполагаю, что вы имели в виду roiw * 0.5), то это произошло бы: incorrect step iteration

итерацию # 3 завершит тест rowindex <= frameWidth - roiw и завершит цикл без сканирования последних 2 пикселей.

Я вижу три варианта, каждый со своими недостатками:

Отказ от ответственности: Все ниже код не испытанные и могут содержать опечатки и логические ошибки. Пожалуйста, проверьте и отрегулируйте соответствующим образом.

  1. Изменить смещение последнего региона, так что подходит к концу изображения. В этом случае приращение последнего rowindex не будет StepRow, а количество пикселей между концом последней области сканирования и концом изображения. Недостатком является то, что последние две области могут перекрываться больше, чем предыдущие, - в нашем случае область 1 будет охватывать пиксели 0: 7, область 2 - 4:11 и область 3 - 6:13.

    Чтобы сделать это, вы можете изменить ваш приращение цикла, чтобы проверить, если это последняя итерация (пожалуйста, подумайте о том, как написать это похорошела, я просто использовал тройной оператор, чтобы сделать изменения меньше):

    for (int rowindex = 0; 
        /* Note that a region of (roiw) pixels ending at (frameWidth - 1) should start 
         at (frameWidth - roiw), so the <= operator should be correct. To verify that, 
         check the single-region case where rowindex == 0 and frameWidth == roiw */ 
        rowindex <= frameWidth - roiw; 
        rowindex += ((rowindex + roiw + StepRow <= frameWidth) ? 
           StepRow : 
           (frameWidth - (rowindex + roiw)))) 
    
  2. Закрепите размер последней области до конца изображения. Недостатком будет то, что ваш последний регион будет меньше, чем до него - в нашем случае регионы 1 и 2 будут иметь размер 8, а область 3 - 6 пикселей.

    Для этого вы можете поместить чек при построении cvRect, чтобы узнать, нужно ли оно меньше. Вы должны также изменить условие цикла как-то, так что вы на самом деле ввести его в этом случае:

    /* (StepRow - 1) should make sure that enter the loop is entered when the 
        last unscanned region has a width between 1 and stepRow, inclusive */ 
    for (int rowindex = 0; rowindex <= frameWidth - roiw + (StepRow - 1); rowindex += StepRow) 
    /* ... column loop ... */ 
        { 
        if (rowindex > frameWidth - roiw) 
        { 
         roiw = frameWidth - rowindex; 
        } 
        searchRect = cvRect(rowindex, colindex, roiw, roih) 
    
  3. Используйте изменяющийся шаг, чтобы ваши участки имеют одинаковую ширину и перекрываются как можно более равномерно. В нашем случае три области будут перекрываться одинаково, находясь в пикселях 0: 7, 3:11 и 6:14, но, очевидно, это не будет верно в большинстве случаев.

    Чтобы сделать это, вы можете рассчитать, сколько итераций вы ожидаете сделать с вашим текущим шагом, а затем разделите на этот номер разницу между вашим кадром и шириной ROI, что даст вам ваш дробный шаг. Поскольку смещение пикселей является целым числом, для построения cvRect вам потребуется целочисленное значение. Я предлагаю хранить и увеличивать rowindex и делать шаг в виде фракций и преобразовывать их в int непосредственно перед использованием в конструкторе cvRect. Таким образом, ваш индекс будет перемещаться как можно более равномерно.

    Обратите внимание, что я использовал значение epsilon для (надеюсь) избежать ошибок округления при преобразовании float-to-int, когда значение float очень близко к int. См. this blog post and comments для примера и объяснения метода. Однако имейте в виду, что код не проверен, и все еще могут быть ошибки округления, особенно если ваши значения int большие!

    /* To see how these calculations work out, experiment with 
        roiw == 8, StepRow == 4 and frameWidth == 14, 15, 16, 17 */ 
    /* N.B.: Does not cover the case when frameWidth < roiw! */ 
    int stepRowCount = (frameWidth - roiw + (StepRow - 1))/StepRow + 1; 
    float step = ((float)(frameWidth - roiw))/(stepRowCount - 1); 
    float eps = 0.005; 
    
    for (float rowindex = 0.0; (int)(rowindex + eps) <= frameWidth - roiw; rowindex += StepRow) 
    /* ... column loop ... */ 
        { searchRect = cvRect((int)(rowindex + eps), colindex, roiw, roih); 
    

PS: Не следует ли ваш индекс, который перебирает ширину изображения можно назвать colindex и наоборот, так как в 1920х1080 изображения у вас есть 1920 столбцов и 1080 строк (следовательно, такие термины, как 1080p)?

+0

Прежде всего, ответьте на PS: да, это порок стиха, я думаю, пока я вил здесь, я смутился с Matlab. –

+0

Я собираюсь попытаться понять логику вашего ответа. Спасибо за вашу помощь, сэр! +1 –

+0

Если у вас есть проблемы с какой-либо частью, оставьте комментарий, и я попытаюсь его прояснить. – mcmlxxxvi

Смежные вопросы