slicktail 1 Жалоба Опубликовано December 21, 2011 Использую Opencv 2.3 и класс Mat. Каким образом можно вывести два изображения рядом друг с другом в одном окне? Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано December 21, 2011 можно вообще попробовать попиксельно выводить изображения в окно. тогда ты точно задаешь каждому пикселю цвет. если возникнут проблемы с реализацией, пиши..помогу) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 21, 2011 ЭЭ не надо попиксельно посмотрите лучше пример из 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] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано December 21, 2011 ЭЭ не надо попиксельно посмотрите лучше пример из opencv который лежит в папке examples/cpp и называется fft.cpp там перестановка квадрантов есть, так вот Вы можете оттуда взять нужные команды. Я бы хотел вывести в одном окне два изображения, чтобы визуально сравнить отличия. Как я понял, это можно и сделать выводом на форму в PictureBox. В OpenCV 2.3 нет данного примера. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 21, 2011 Пример вывод на форму есть на форуме. Для того, чтобы вывести два изображения, нужно их объединить в одно, а затем выводить на форму. Для того, чтобы их объединить нужно создать изображение, в котором поместится два Ваших изображения, затем назначить область, с которой вы будете работать (например Mat q0(Large, Rect(0, 0, cx, cy)); ) и скопировать первое изображение в эту область Img1.copyTo(q0); назначить вторую область и вывести второе изображение. Вывести изображение Large в PictureBox. ЗЫ: размер и тип назначенной области вывода должен соответствовать размеру и типу копируемого в него изображения. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
slicktail 1 Жалоба Опубликовано December 21, 2011 Пример вывод на форму есть на форуме. Для того, чтобы вывести два изображения, нужно их объединить в одно, а затем выводить на форму. Для того, чтобы их объединить нужно создать изображение, в котором поместится два Ваших изображения, затем назначить область, с которой вы будете работать (например Mat q0(Large, Rect(0, 0, cx, cy)); ) и скопировать первое изображение в эту область Img1.copyTo(q0); назначить вторую область и вывести второе изображение. Вывести изображение Large в PictureBox. ЗЫ: размер и тип назначенной области вывода должен соответствовать размеру и типу копируемого в него изображения. Большое спасибо за подсказку, все получилось, свободно вывел два изображения рядом! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано February 10, 2016 Вопрос по теме. Я понял что можно два изображения вывести на одном. У меня возникли трудности с вышеописанным методом. Вот несложный код: 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; Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 10, 2016 N_CopyFrame.cols=OriginalFrame1.cols*5; Не, ну так не делается Создайте матрицу с требуемыми размерами. При создании выделяется пямять, нельзя просто присвоить другой размер матрицы. И Mat лучше грузить через cv::imread. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано February 10, 2016 Создал матрицу 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 я неверно подобрал. Где можно посмотреть какой формат у оригинального изображения? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 10, 2016 Если грузите цветное, например imread("111.png",1); то формат CV_8UC3. А размеры загружаемых изображений проверяли? Они одинаковые? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано February 10, 2016 Да, их размеры одинаковы (это копии первого файлика с небольшими изменениями в Paint). В Paint, собсвтенно, я и и сделал. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Dvoetut 2 Жалоба Опубликовано February 11, 2016 Это все очень странно, но сегодня все заработало как нужно!! Я даже код не менял))) Спасибо за подсказку!!! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах