2016-01-24 2 views
0

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

struct RoiRect { 
    unsigned int left; 
    unsigned int top; 
    unsigned int right; 
    unsigned int bottom; 

    bool isAllZero() { 
     return left == 0 && top == 0 && left == 0 && bottom == 0; 
    } 

    void getCvRect(cv::Size cvSize, cv::Rect &cvRect) { 
      int height = cvSize.height; 
      int width = cvSize.width; 

      int x = ((double)(left/height)*100); 
      int y = ((double)(top/height)*100); 
      int w = width - ((double)(right/width)*100); 
      int h = height - ((double)(bottom/width)*100); 

      cvRect.x = x; 
      cvRect.y = y; 
      cvRect.width = w; 
      cvRect.height = h; 
    } 
}; 

Я инициализировать эту структуру со значениями, как 10 , 15,20,25. Это означает, что изображение должно быть обрезано на 10% с правой стороны, 15% от его верхней части и так далее.

В другом классе я буду называть getCvRect от структуры и передать размер изображения, а также сырой cv::Rect объект таким образом, выше, функция расчета процентных и возвращает прямоугольник, чтобы быть обрезаны с картинки:

//inside another function 
cv::Rect rect; //rect to be calculated by getCvRect function of the struct 
bool crop; //should crop or not? if all == zero then NOT! 
if(!mRoiRect.isAllZero()) { 
    crop = true; 
    mRoiRect.getCvRect(mat.size(), rect); 
} 

Но все усилия напрасно! Я передаю размер в качестве первого аргумента, и я уверен, что размер изображения, например. 640x480 ... rect объект после вызова функции показывает 640x480 ... поэтому моя функция абсолютно ничего не делает.

Что я делаю неправильно, и что я могу сделать, чтобы исправить или лучше, что является более умным способом выполнения этой задачи?

Правильное применение станет (кто интересуется)

int x = ((double) left/100) * width; 
    int y = ((double) top/100) * height; 
    int w = width - ((double) right/100) * width; 
    int h = height - ((double) bottom/100) * width; 
+0

Подсказка: 'влево/height' выполнен в виде целочисленного деления – WorldSEnder

+0

голосования, чтобы закрыть. Вы были здесь достаточно активны, чтобы понять минимальные полные примеры. (И они так же важны для разработки и тестирования, как и для размещения вопросов.) – Beta

+0

@ Бета, ты прав ... это была простая ошибка ... Я тоже голосую! –

ответ

3

Проблема находится в четырех направлениях:

 int x = ((double)(left/height)*100); 
     int y = ((double)(top/height)*100); 
     int w = width - ((double)(right/width)*100); 
     int h = height - ((double)(bottom/width)*100); 

здесь left/height т.д ... любое использование целочисленное деление и то результат получает заклинание до двойника. Эффект, конечно же, заключается в том, что x и y и оба нуль и w == width и h == height. Что вы имели в виде писать, скорее всего,

 int x = ((double) left)/height*100; 
     int y = ((double) top)/height*100; 
     int w = width - ((double) right)/width*100; 
     int h = height - ((double) bottom)/width*100; 
+0

Это подскочило к моему глазу, когда я увидел, что –

+0

Argggghh .... блин, эти скобки всегда терпят неудачу ... –

1

функция образца, который я использовал, может быть полезен для улучшения кода

Rect shrinkRect(Rect rect, int width_percent, int height_percent) 
{ 
    if (width_percent > 100) width_percent = 100; 
    if (height_percent > 100) height_percent = 100; 

    Rect newrect; 
    newrect.width = (rect.width * width_percent)/100; 
    newrect.height = (rect.height * height_percent)/100; 
    newrect.x = rect.x + (rect.width - newrect.width)/2; 
    newrect.y = rect.y + (rect.height - newrect.height)/2; 

    return newrect; 
} 

использования: позволяет сказать, что у вас есть Rect r = Rect(0,0,100,100)

вы хотите усадка вашего прямоугольника% 20

Rect shrinkedRect = shrinkRect(r, 80, 80) 

shrinkedRect is (10,10,80,80)

вы можете дать разные значения для width_percent и height_percent

+0

Спасибо .... Я не знаю, почему opencv не обладает такой функциональностью –