2014-09-14 4 views
4

Я кодирую в C++ и пытаюсь изменить размер изображения 2 до тех же размеров, что и изображение 1, однако я не хочу растягивать изображение. Я пытаюсь скопировать изображение2 в заполненную матрицу (в точке 0,0). Получаем ошибку:Pad изображение с нулями

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in Mat , file C:\opencv\opencv\modules\core\src\matrix.cpp, line 323

Код ниже. Заранее спасибо

Mat padded; 
    padded.setTo(cv::Scalar::all(0)); 
    padded.create(image1.rows,image1.cols, image2.type()); 
    image2.copyTo(padded(Rect(0, 0, image2.rows, image2.cols))); 
+0

Устранение ошибки означает, что любое из указанных условий не получилось. Просто проверьте все параметры, указанные в условии assert, и вы поймете, почему это происходит. –

+2

image2.copyTo (padded (Rect (0, 0, image2.rows, image2.cols))); // вы меняли местами строки и столбцы – berak

ответ

-1

Я не знаю синтаксис, но вот псевдокод

float width1, height1; //size of image1 
float width2, height2; //original size of image2 
float scale; 

bool portrait = width2 < height2; 

if(portrait) scale = height1/height2; 
else scale = width1/width2; 

float scaled_width2 = width2 * scale; 
float scaled_height2 = height2 * scale; 

Когда изображение портрета, мы заполняем высоту, в противном случае мы заполняем ширину. Делая это таким образом, изображение будет добраться до максимального размера без растягивания

2

Вы можете использовать функцию OpenCV copyMakeBorder раздуть изображение:

Чтобы достичь того, чего вы хотите, вы можете попробовать следующее:

cv::Mat padded; 

//Assuming that dimensions of image1 are larger than that of image2 
//Calculate padding amount so that total size after padding is equal to image1's size 
int rowPadding = image1.rows - image2.rows; 
int colPadding = image1.cols - image2.cols; 

cv::copyMakeBorder(image2, padded, 0, rowPadding, 0, colPadding, cv::BORDER_CONSTANT, cv::Scalar::all(0)); 
+0

Когда я использую предоставленный вами код, он выходит из строя и отображает ошибку: penCV Error: Assertion failed (top> = 0 && bottom> = 0 && left> = 0 && right> = 0) в copyMakeBorder , файл C: \ opencv \ opencv \ modules \ imgproc \ src \ utils.cpp, строка 208 – Adsa

+0

gotit working I relised image2 число cols было больше, чем image1. Спасибо за вашу помощь – Adsa

+0

@ Adsa .. Хорошо, если он работает, вы можете подумать о принятии ответа :). – sgarizvi

1

Это почти то же самое, что и у I asked before. Что касается вас, вы просто подменяете cols и rows в вызове функции как berak, уже упомянутый выше.

Метод copyMakeBorder (...) существует как для Mat, так и для oclMat, поэтому было бы полезно, если вы попробуете openCL-расширение openCV для лучшей производительности.

Смежные вопросы