2014-09-14 3 views
4

C++로 코딩 중이며 이미지 2의 크기를 이미지 1과 동일한 크기로 조정하려하지만 이미지를 늘리지는 않겠습니다. 패딩 된 행렬에 image2를 복사하려고합니다 (점 0,0). 오류가 발생했습니다 :0으로 이미지 채우기

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

어설 션 오류는 위에서 언급 한 조건 중 하나라도 실패했음을 의미합니다. 단언 조건에 언급 된 모든 매개 변수를 확인하면 왜 이런 일이 일어나는지 알 수 있습니다. –

+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

내가 제공 한 코드를 사용할 때 오류가 발생하고 오류를 표시합니다 : copyMakeBorder에서 penCV 오류 : 어설 션이 실패했습니다 (맨 위 = 0 && bottom> = 0 && left> = 0 && right> = 0). , 파일 C : \ opencv \ opencv \ modules \ imgproc \ src \ utils.cpp, 라인 208 – Adsa

+0

gotit 내가 image2 numbers cols의 image1보다 큽니다 relied. 도움을 주셔서 감사합니다 – Adsa

+0

@ Adsa .. 잘 작동하는 경우, 당신은 대답을 수락 고려할 수 있습니다 :). – sgarizvi

1

거의 동일합니다. I asked before입니다. 이미 위에서 언급 한 바와 같이 berak과 같이 함수 호출에서 cols와 행을 교환하면됩니다.

메소드 copyMakeBorder (...)는 Mat와 oclMat 모두에 존재하므로 더 나은 성능을 위해 openCV의 openCL-extension을 시도 할 경우 유용 할 수 있습니다.