2014-05-11 4 views
1

두 개 이상의 이미지를 나란히 결합하는 방법에 대한 예가 있습니까? 자바 있음OpenCV java. 여러 이미지 나란히 나란히

나는 C++ 코드를 적용하려고했지만 성공하지는 못했습니다.

Mat m = new Mat(imageA.cols(), imageA.rows() + imageB.rows(), imageA.type()); 

m.adjustROI(0, 0, imageA.cols(), imageA.rows()); 
imageA.copyTo(m); 

m.adjustROI(0, imageA.rows(), imageB.cols(), imageB.rows()); 
imageB.copyTo(m); 

이 항상 imageAm을 줄 것이다. 방법 A.copyTo(B)는 항상 C에서 B == A

거의 모든 예제와 ++는 자바 아날로그처럼 보이는 cvCopy(arg1, arg2);이 A.copyTo (B)

하지만 A.copyTo (B)를 사용할 때, 난 항상 폭 이미지를 얻을 것입니다 포함 결과 , B가 더 크더라도 A의 높이와 내용.

+0

조정 된 ROI가 잘못된 차원이; 'm'이 아닌 imageA에 맞도록 크기를 조정해야합니다 (잘못된 창으로 인해 무시되거나 예외가 발생했을 수 있습니다). 미래를 위해서는 항상 "성공하지 못했습니다"보다 자세한 내용을 말해주십시오 – Dave

+0

@Dave 나는이 게시물을 업데이트했습니다. ROI를 설정해야합니까? A.copyTo (B) 메서드가 매트 B == 매트 A를 만들고 ROI를 고려하지 않은 것처럼 보입니다 – ZuzEL

답변

2
private Mat addTo(Mat matA, Mat matB) { 
    Mat m = new Mat(matA.rows(), matA.cols() + matB.cols(), matA.type()); 
    int aCols = matA.cols(); 
    int aRows = matA.rows(); 
    m.rowRange(0, aRows-1).colRange(0, aCols-1) = matA; 
    m.rowRange(0, aRows-1).colRange(aCols, (aCols*2)-1) = matB; 
    return m; 
} 

나는 그것을 실행하려고 시도하지는 않았지만 작동한다고 믿습니다. 나는 matA라고 가정하고 matB는 같은 크기같은 종류을 갖습니다. 작동하지 않는 경우에도 약간의 구문 오류가 있어야합니다. 4 for 루프를 사용하여 픽셀 값을 입력하지 않아야합니다!

+0

고맙습니다. 더 좋은 솔루션 (아직 시도하지 않은 것 같습니다.)이 작동하지 않을 경우 여기로 돌아와서 – ZuzEL

+0

에 대한 의견을 말합니다.이 코드를 적용 할 때 몇 가지 문제가있었습니다. 나는 실제 매개 변수가 'rowRange (0, aRows)'와 같아야한다고 생각한다. 마지막 인덱스는 범위를 지정하는 일반적인 방법처럼 마지막 이후이다. – dividebyzero

0

마지막으로 네이티브 솔루션이 없음을 알았고은 내가 할 수있는 최선의 방법은 픽셀을 새 매트릭스에 나란히 추가하는 것입니다.

private Mat addTo(Mat matA, Mat matB) { 
    Mat m = new Mat(matA.rows(), matA.cols() + matB.cols(), matA.type()); 
    int aCols = matA.cols(); 
    int aRows = matA.rows(); 
    for (int i = 0; i < aRows; i++) { 
     for (int j = 0; j < aCols; j++) { 
      m.put(i, j, matA.get(i, j)); 
     } 
    } 
    for (int i = 0; i < matB.rows(); i++) { 
     for (int j = 0; j < matB.cols(); j++) { 
      m.put(i, aCols + j, matB.get(i, j)); 
     } 
    } 
    return m; 
} 

이 오른쪽에서 왼쪽 matAmatB으로 새 매트를 생성합니다. 이것은 매우 간단한 구현이며 matA.rows() >= matB.rows()과 둘 모두 채널 수가 정확히 동일한 경우에만 작동합니다. 하지만 어쨌든, 좋은 출발점.

+0

사람을 downvote 할 수 없습니다. 그러나 정말로 ...'for '로 이미지를 복사하지 마십시오. – dividebyzero

1

당신은 실제로 사용할 수 있습니다 hconcat/vconcat 기능 :

Mat dst = new Mat(); 
List<Mat> src = Arrays.asList(mat1, mat2); 
Core.hconcat(src, dst); 
//Core.vconcat(src, dst);