2017-11-08 2 views
0

Java OpenCV (3.3.1, windows 8 x64)와의 첫 접촉에서 ROI가있는 서로 다른 크기의 이미지를 동적으로 결합하려고합니다. 여기에 내 코드의 비트 :다른 크기의 이미지를 ROI로 결합

Mat _mat = Utils.imageFileToMat(new File("angelina_jolie.jpg")); //Angelina's face 
Mat grayMat = new Mat(); 
Imgproc.cvtColor(_mat, grayMat, Imgproc.COLOR_BGR2GRAY); 
Rect rect = new Rect(new Point(168, 104), new Point(254, 190)); //Angelina's eye ROI 
Mat truncated = _mat.submat(rect); //Angelina's eye mat 

Mat merge = _mat.clone(); 
truncated.copyTo(merge); 

//show _mat 
//show truncated 
//show merge 

내가보고 싶은 것은 안젤리나 졸리가 그레이 스케일에 그녀의 눈이다.

내가 보는 것은 단정 또는 자른 이미지 (단지 눈)입니다.

나는 copyTo(mat, mask), setOf과 같이 시도했지만 항상 많은 새로운 주장을했습니다.

크기에 맞게 잘린 크기를 잘라야합니까? 프로그래밍 방식으로 어떻게 할 수 있습니까?

답변

1

Mat::copyTo 문서 : 다른 매트릭스

있어서 복사 매트릭스 데이터. 데이터를 복사하기 전에, 방법은 호출 : 필요한 경우

m.create(this->size(),this->type()); 

대상 행렬 를 재 할당됩니다 그래서. 반면 m.copyTo (m); 함수는 완벽하게 작동하지만 은 소스와 대상 행렬간에 부분적으로 겹치는 경우를 처리하지 않습니다. 작동 마스크가 지정되면 매트 :: 를 나타낸 통화를 생성하여 상기 행렬을 재 할당하는 경우

는 새롭게 할당 된 행렬은 데이터를 복사하기 전에 모두 제로로 초기화 이다.

@param m 대상 행렬. 작업 전에 적절한 크기 또는 유형이 없으면 다시 할당됩니다.

src 및 dst 이미지의 크기와 채널이 동일하지 않기 때문에 대상 이미지가 다시 할당되고 0으로 초기화됩니다. 이를 피하려면 두 이미지의 치수와 채널 수가 동일해야합니다.

Imgproc.cvtColor(grayMat, grayMat, Imgproc.COLOR_GRAY2BGR); 

지금 마스크를 만들 : 나는 해결책을 발견하고 내가 대답을 보았 기 때문에

Mat mask = new Mat(_mat.size(), CvType.CV_8UC1, new Scalar(0)); 
Imgproc.rectangle(mask, new Point(168, 104), new Point(254, 190),new Scalar(255)); 
// copy gray to _mat based on mask 
Mat merge = _mat.clone(); 
grayMat.copyTo(merge,mask); 
+0

내가 내 자신의 질문에 대답하기 위해 여기에왔다. 감사! (대답에 대한 답변 opencv 사이트 나는 대답도하고 싶다면 같은 질문을 게시했습니다.) – jotapdiez

+0

@jotapdiez 당신이 그 중 하나를 사용합니다.) 당신이 해결책을 찾았습니다. – zindarod

+0

Imgproc.cvtColor (grayMat, grayMat, Imgproc.COLOR_GRAY2BGR) 및 truncated.copyTo (merge.submask ....)만으로 문제를 해결합니다. 마스크 생성은 서브 마스크보다 낫습니다? – jotapdiez

관련 문제