Недавно я проводил исследование о том, как обнаружить дублированный регион в изображении, используя OpenCV + eclipse в Ubuntu. Я также читаю ссылки на код SIFT, SURF, Feature2d + Homomorphy, но этот код - это просто сравнение между объект изображения и сцена изображения? Я не знаю, как объединить эти алгоритмы в изображение. Чтобы я мог использовать его для обнаружения дублированной области в изображении AN.
Проблема заключается в методе, с помощью которого вы устанавливаете рентабельность инвестиций. Вы используете cvSetImageROI()
который используется для "IplImage", а не для изображений "Mat". А с другой стороны, вы загружаете изображение в формате Mat. Это причина этой ошибки.
Я написал код. Вы можете изменить код в соответствии с вашими потребностями. Код сохранит меньшие изображения в папке "less_images". Поэтому не забудьте создать новую папку с именем "small_images".
int main( )
{
Mat image;
int width_step;
int height_step;
//image = imread( argv[1], CV_LOAD_IMAGE_COLOR);
image = imread( "myImage.jpeg", CV_LOAD_IMAGE_COLOR);
int rows = image.rows;
int cols = image.cols;
cv::Size s = image.size();
rows = s.height;
cols = s.width;
cout<<"The width of the image: "<<cols<< endl;
cout<<"The height of the image: "<<rows<< endl;
cout<< "Input your width_step= ";
cin>>width_step;
cout<< "Input your height_step= ";
cin>>height_step;
double each_width= cols/width_step;
double each_height= rows/height_step;
cout<< "The width_size of each region "<<each_width<< endl;
cout<< "The height_size of each region "<<each_height<< endl;
//-------------------------
int i=0;
for(int x=0; x<(cols - width_step); x++ )
{
for (int y=0; y < (rows - height_step ); y++)
{
if( x <(cols - width_step) && y < (rows - height_step ) )
{
Mat smallerImage;
smallerImage.create(height_step, width_step, CV_8UC3);
Rect regionOfInterest = Rect (x, y, width_step, height_step); // Rect (min_x,min_y, cols, rows);
//mySquare= original_frame(regionOfInterest);
smallerImage = image( regionOfInterest );
///Increasing the value of "x" and "y" for next image for "Rect()"
x = x + width_step;
y = y + height_step;
i = i+1;
/// Saving the smaller image to a folder called "smaller_image"
char name_writeImage[255];
sprintf(name_writeImage, "smaller_images/%d.jpg" ,i );
imwrite(name_writeImage,smallerImage );
}
}
}
waitKey(0);
return 0;
}
вы можете решить, сколько меньших изображений вы хотели бы разделить. Итак, скажем, вы хотите создать 4 меньших изображения с вашего изображения размером 400 x 400. Таким образом, каждое ваше изображение будет иметь размер 100 x 100.
Итак, теперь вам нужно создать 4 изображения.
Первое изображение: верхний левый угол (0,0), ширина = 400/4 = 100, высота = 400/4 = 100
Mat image1;
image1.create(height, width, CV_8UC3);
Rect regionOfInterest_1 = Rect (0,0, width, height);
image1= original_Image(regionOfInterest_1);
Второе изображение: верхний левый угол (0,101), ширина = 400/4 = 100, высота = 400/4 = 100
Mat image2;
image2.create(height, width, CV_8UC3);
Rect regionOfInterest_2 = Rect (0,101, width, height);
image2= original_Image(regionOfInterest_2);
Третье изображение: верхний левый угол (0,101), ширина = 400/4 = 100, высота = 400/4 = 100
Mat image3;
image3.create(height, width, CV_8UC3);
Rect regionOfInterest_3 = Rect (101,0, width, height);
image3= original_Image(regionOfInterest_3);
и так далее... вы можете сделать это, используя цикл for, вместо того, чтобы писать его отдельно. Но сначала вам нужно понять концепцию создания меньшего изображения из исходного изображения с помощью "Rect Region of interest".
Один совет: взгляните на аргументы Rect(x, y, width, height)
. В openCV X-координата представляет столбцы/ширину, а Y-координата представляет строки/высоту.
Я не знаю, каково ваше приложение, но вы можете определить какой-то небольшой регион интересов в своем образе... вы также можете создавать независимые изображения из этих регионов, а затем через рекурсивный цикл, который вы можете проверить, - это сходство между различными регионы.
Например: вы можете взглянуть на следующую иллюстрацию, где у нас больше изображение, а затем мы определяем несколько областей интересов (ROI), а затем создаем меньшие изображения из этих ROI, а затем мы можем найти сходство между этими меньшими изображениями (которые на самом деле являются частью исходного изображения)