Перейти к содержимому
Compvision.ru
slicktail

Вывод двух изображений в одно окно

Recommended Posts

Использую Opencv 2.3 и класс Mat. Каким образом можно вывести два изображения рядом друг с другом в одном окне? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

можно вообще попробовать попиксельно выводить изображения в окно. тогда ты точно задаешь каждому пикселю цвет.

если возникнут проблемы с реализацией, пиши..помогу)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ЭЭ не надо попиксельно :)

посмотрите лучше пример из opencv который лежит в папке examples/cpp и называется fft.cpp там перестановка квадрантов есть, так вот Вы можете оттуда взять нужные команды.

вот нужный кусок:

    // crop the spectrum, if it has an odd number of rows or columns
mag = mag(Rect(0, 0, mag.cols & -2, mag.rows & -2));

int cx = mag.cols/2;
int cy = mag.rows/2;

// rearrange the quadrants of Fourier image
// so that the origin is at the image center
Mat tmp;
// назначаем область интереса. Эти матрицы - не самостоятельные матрицы, они указывают на область памяти матрицы mag.
Mat q0(mag, Rect(0, 0, cx, cy));
Mat q1(mag, Rect(cx, 0, cx, cy));
Mat q2(mag, Rect(0, cy, cx, cy));
Mat q3(mag, Rect(cx, cy, cx, cy));

q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);

q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ЭЭ не надо попиксельно :)

посмотрите лучше пример из opencv который лежит в папке examples/cpp и называется fft.cpp там перестановка квадрантов есть, так вот Вы можете оттуда взять нужные команды.

Я бы хотел вывести в одном окне два изображения, чтобы визуально сравнить отличия. Как я понял, это можно и сделать выводом на форму в PictureBox. В OpenCV 2.3 нет данного примера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пример вывод на форму есть на форуме. Для того, чтобы вывести два изображения, нужно их объединить в одно, а затем выводить на форму.

Для того, чтобы их объединить нужно создать изображение, в котором поместится два Ваших изображения, затем назначить область, с которой вы будете работать (например Mat q0(Large, Rect(0, 0, cx, cy)); ) и скопировать первое изображение в эту область Img1.copyTo(q0); назначить вторую область и вывести второе изображение.

Вывести изображение Large в PictureBox.

ЗЫ: размер и тип назначенной области вывода должен соответствовать размеру и типу копируемого в него изображения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пример вывод на форму есть на форуме. Для того, чтобы вывести два изображения, нужно их объединить в одно, а затем выводить на форму.

Для того, чтобы их объединить нужно создать изображение, в котором поместится два Ваших изображения, затем назначить область, с которой вы будете работать (например Mat q0(Large, Rect(0, 0, cx, cy)); ) и скопировать первое изображение в эту область Img1.copyTo(q0); назначить вторую область и вывести второе изображение.

Вывести изображение Large в PictureBox.

ЗЫ: размер и тип назначенной области вывода должен соответствовать размеру и типу копируемого в него изображения.

Большое спасибо за подсказку, все получилось, свободно вывел два изображения рядом!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вопрос по теме. Я понял что можно два изображения вывести на одном. У меня возникли трудности с вышеописанным методом. Вот несложный код:

Mat OriginalFrame1=cvLoadImage("111.png",1);//загружаем картинки
Mat OriginalFrame2=cvLoadImage("222.png",1);//их параметры одинаковы
Mat OriginalFrame3=cvLoadImage("333.png",1);
Mat OriginalFrame4=cvLoadImage("444.png",1);
Mat OriginalFrame5=cvLoadImage("555.png",1);
Mat N_CopyFrame;//Тут эти пять изображений должны быть выстроены в ряд, порядок не важен
//-----------------------------------------------------------------------------
//две строки ниже, это результат моих неудачных изысканий
OriginalFrame1.copyTo(N_CopyFrame);//сначало скопируем одно из изображений в суммарное
N_CopyFrame.cols=OriginalFrame1.cols*5;//эта операция делает почти то что мне нужно, получается 5 копий 
//исходного изображения с артефактами
//-----------------------------------------------------------------------------

//Это матрицы указывают на области изображения в суммарном изображении
	Mat Img1(N_CopyFrame,Rect(0,0,OriginalFrame1.cols,OriginalFrame1.rows));
	Mat Img2(N_CopyFrame,Rect(OriginalFrame1.cols,0,OriginalFrame1.cols,OriginalFrame1.rows));
	Mat Img3(N_CopyFrame,Rect(OriginalFrame1.cols*2,0,OriginalFrame1.cols,OriginalFrame1.rows));
	Mat Img4(N_CopyFrame,Rect(OriginalFrame1.cols*3,0,OriginalFrame1.cols,OriginalFrame1.rows));
	Mat Img5(N_CopyFrame,Rect(OriginalFrame1.cols*4,0,OriginalFrame1.cols,OriginalFrame1.rows));
//с их помощью заполним суммарное изображение
//Строки ниже вызывают ошибку!!!!
OriginalFrame3.copyTo(Img2);
OriginalFrame2.copyTo(Img2);
OriginalFrame3.copyTo(Img3);
OriginalFrame4.copyTo(Img4);
OriginalFrame5.copyTo(Img5);

По идее загруженные изображения должны встать на место Img1, Img2... Но копирование не происходит!  Код получился кривоватым. Я пытался делать через LocateROI, но видимо до конца не разобрался.

Помогите пожалуйста!!

Ниже картинка, иллюстрирующая код

N_CopyFrame.cols=OriginalFrame1.cols*5;

 

77.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
N_CopyFrame.cols=OriginalFrame1.cols*5;

Не, ну так не делается :)

Создайте матрицу с требуемыми размерами.

При создании выделяется пямять, нельзя просто присвоить другой размер матрицы.

И Mat лучше грузить через cv::imread.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создал матрицу

Mat N_CopyFrame(OriginalFrame1.rows,OriginalFrame1.cols*5,CV_8UC3);

Далее идет код

Mat Img1(N_CopyFrame,Rect(0,0,OriginalFrame1.cols,OriginalFrame1.rows));
	Mat Img2(N_CopyFrame,Rect(OriginalFrame1.cols,0,OriginalFrame1.cols,OriginalFrame1.rows));
	Mat Img3(N_CopyFrame,Rect(OriginalFrame1.cols*2,0,OriginalFrame1.cols,OriginalFrame1.rows));
	Mat Img4(N_CopyFrame,Rect(OriginalFrame1.cols*3,0,OriginalFrame1.cols,OriginalFrame1.rows));
	Mat Img5(N_CopyFrame,Rect(OriginalFrame1.cols*4,0,OriginalFrame1.cols,OriginalFrame1.rows));

Но в итоге получается пустое изображение. Может параметр CV_8UC3 я неверно подобрал.

Где можно посмотреть какой формат у оригинального изображения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если грузите цветное, например imread("111.png",1); то формат CV_8UC3.

А размеры загружаемых изображений проверяли? Они одинаковые?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, их размеры одинаковы (это копии первого файлика с небольшими изменениями в Paint). В Paint, собсвтенно, я и и сделал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это все очень странно, но сегодня все заработало как нужно!! Я даже код не менял)))

Спасибо за подсказку!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×