cvSetImageROI не работает


У меня проблема с неработающим cvSetImageROI. Пожалуйста, помогите мне исправить проблему. У меня есть изображение (скажем, original_image для условности), которое я пытаюсь разделить на три равные части. Я назвал три получившихся прямоугольника прямоугольником1, прямоугольником2, прямоугольником3 для удобства. Поскольку мое изображение имеет форму прямоугольника, каждый полученный прямоугольник имеет 1/3 ширины original_image.
Моя идея для этого изображения: разделить ширину изображения на 3, чтобы результат был равен каждому ширины трех прямоугольников.
Хотя, когда я пытаюсь это сделать, мой setImageROI не работает.

Я размещаю здесь фрагмент кода для извлечения прямоугольника1. Пожалуйста, подскажите, где я ошибаюсь. Ее значения x и y являются значениями прямоугольника original_image.

int resultant_rectangle_width = ((int)(original_image->width/3));
int resultant_rectangle_height = (int)original_image->height;
cvSetImageROI(original_image, cvRect(x, y,resultant_rectangle_width,resultant_rectangle_height));

//this cout block was to check if the ROI was set on original_image,but it showed the original_image properties here.
cout<<"original_image width after setting roi:"<<original_image->width<<endl;
cout<<"original_image height after setting roi:"<<original_image->height<<endl;

//copying the ROI to another image
IplImage *rectangle1 = cvCreateImage(cvGetSize(original_image),original_image->depth,original_image->nChannels);
    cvCopy(original_image, rectangle1);//using three arguments also did not help
    cvResetImageROI(original_image);
    cvShowImage("rectangle1", rectangle1);

Прямоугольник1, который я пытаюсь показать, показывает неправильное обрезанное изображение, то есть с неправильной высотой. Я не понимаю, где я изменяю высоту original_image, чтобы прямоугольник1 отображал неправильную высоту.
Я ожидаю, что код даст мне изображение той же высоты, что и исходное изображение, но с шириной 1/ 3-я часть исходного изображения.


person Shruthi Kodi    schedule 26.04.2015    source источник
comment
Вы забыли сказать, что происходит не так. Разве cvCopy не должно принимать три аргумента?   -  person Weather Vane    schedule 26.04.2015
comment
Прямоугольник1 показывает неправильно обрезанное изображение. Я также пробовал с тремя аргументами, с третьим аргументом как NULL, но это не имело никакого значения.   -  person Shruthi Kodi    schedule 26.04.2015
comment
Должен ли cvSetImageROI использовать cvRect(0,0, ... для выбора левой части изображения, так как это верхний левый угол изображения?   -  person Weather Vane    schedule 26.04.2015
comment
Спасибо! Извините за новичок и мои глупые вопросы, означает ли это, что setimageroi всегда использует 0,0 в качестве начальной ссылки? Кроме того, у меня есть еще одно сомнение. Когда область исследования вырезается из изображения и копируется на другое изображение, даже тогда обрезанное изображение в верхнем левом углу обозначается как (0,0)?   -  person Shruthi Kodi    schedule 26.04.2015
comment
Я никогда не использовал эти функции, но я немного погуглил, как и вы. Координаты относительно изображения. Сбросив основное изображение, вы выберете средний раздел с cvRect(width/3, 0...) и т. д. docs.opencv.org/2.4.9/modules/core/doc/   -  person Weather Vane    schedule 26.04.2015
comment
Спасибо вам @WeatherVane   -  person Shruthi Kodi    schedule 27.04.2015


Ответы (1)


Попробовал ваш код, но ничего плохого не нашел. Возможно, ваши x и y не равны нулю во фрагменте.

cvWaitKey(0) добавляются только для отладки, это не влияет на ваш код.

Ваш код:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/opencv.hpp>
using namespace std;

int main(){
    IplImage *original_image = cvLoadImage("C:/1.jpg", 0);
    cvShowImage("orig", original_image);
    int x = 0;
    int y = 0;

    int resultant_rectangle_width = ((int)(original_image->width/3));
    int resultant_rectangle_height = (int)original_image->height;

    //Remember that (x,y) is the coordination of the up-left corner. 
    //Official Document: http://docs.opencv.org/2.4.9/modules/core/doc/basic_structures.html
    cvSetImageROI(original_image, cvRect(x, y,resultant_rectangle_width,resultant_rectangle_height));

    //this cout block was to check if the ROI was set on original_image,but it showed the original_image properties here.
    cout<<"original_image width after setting roi:"<<original_image->width<<endl;
    cout<<"original_image height after setting roi:"<<original_image->height<<endl;
    cvShowImage("3", original_image);
    cvWaitKey(0);
    //copying the ROI to another image
    IplImage *rectangle1 = cvCreateImage(cvGetSize(original_image),original_image->depth,original_image->nChannels);
    cvCopy(original_image, rectangle1);//using three arguments also did not help
    cvResetImageROI(original_image);
    cvShowImage("rectangle1", rectangle1);
    cvWaitKey(0);
    return 0;
}

Результат:

Изображение целиком Все изображение

рентабельность инвестиций

ROI

Как видите, они действительно одного роста. Таким образом, может быть большая вероятность того, что вы по ошибке установили x и y какое-то неправильное значение.

person pwwpche    schedule 27.04.2015
comment
Большое спасибо!! Я понял ошибку. Я давал неправильные значения x и y (исходное изображение, которое я упомянул здесь, также является обрезанным изображением другого, поэтому я все время работал с неправильными значениями x и y), теперь код работает нормально. Спасибо вам обоим @pwwpche !! - person Shruthi Kodi; 27.04.2015