2011-02-23 5 views
16

동일한 창에서 2, 3 개 이상의 이미지를 표시하려고합니다.OpenCV의 동일한 창에 여러 개의 (2,3,4, ...) 이미지 표시

내 문제는 두 번째, 세 번째 이미지를 주 이미지의 오른쪽 (위, 왼쪽 또는 위쪽)에 배치하는 방법입니다.

OpenCV를 사용하여 이와 같은 것을 만들고 싶습니다. 대답은 당신이 (C 또는 C++를) 사용하는 인터페이스에 따라 사전 호르헤

답변

14

당신은 OpenCV의 위키에 대한 답변을 찾을 수 있습니다

https://github.com/opencv/opencv/wiki/DisplayManyImages

:-)를

+0

좋은 답변입니다. 테스트를 거쳤으며 잘 작동합니다. 다른 시간에 고마워. –

+3

링크가 깨졌습니다. 새로운 코드는 다음과 같습니다. http://code.opencv.org/projects/opencv/wiki/DisplayManyImages –

+1

요즘 정말 오래된 학교 인 C API를 사용하고 있습니다. – Stefan

7

에서

--------------- 
|  |  | 
|  |  | 
--------------- 
| |  | 
| |  | 
--------------- 

감사합니다. 일반 워크 플로를

  • 는 큰 이미지
    • C++로 이미지를 복사하여 합성 이미지를 수용 할만큼 큰 (C++, C에 대한 IplImage*에 대한 cv::Mat) 이미지를 만드는 것입니다 다음 Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange) 생성자를 사용하여 얻을 수 있습니다 cv::Mat을 사용하여 원래 창의 하위 이미지를 가리킨 다음 copyTo 방법을 사용하여 작은 이미지를 큰 이미지로 복사하십시오.
    • C : 큰 이미지에 ROI를 설정하고 작은 이미지를 복사하십시오.
+0

좋아. 아이디어를 가져 주셔서 감사합니다. ROI는 OpenCV에서 매우 중요합니다. –

-2

GUI는 OpenCV의 포함하여 큰 이미지를 표시하면 복잡한 작업을 수행 할 필요가있는 경우, 당신이 정말로 같은 창에 QT 또는 VC++로 GUI 프레임 워크를 사용한다, 매우 제한되어

+0

나는 MAC와 함께 일한다. 하지만 이제는 OpenCV 프레임 워크에서만 작업하고 싶습니다. 나중에 더 많은 옵션을 갖기 위해 외부 프레임 워크를 사용해야 할 필요가 있음을 안다. 귀하의 답변에 감사드립니다. –

17

저는 이것을 최근에 구현했습니다. 그래서 그것을 공유하는 생각. C++ API를 사용합니다. 코드는 자명하다 (잘하면).

/** 
    * @brief makeCanvas Makes composite image from the given images 
    * @param vecMat Vector of Images. 
    * @param windowHeight The height of the new composite image to be formed. 
    * @param nRows Number of rows of images. (Number of columns will be calculated 
    *    depending on the value of total number of images). 
    * @return new composite image. 
    */ 
    cv::Mat makeCanvas(std::vector<cv::Mat>& vecMat, int windowHeight, int nRows) { 
      int N = vecMat.size(); 
      nRows = nRows > N ? N : nRows; 
      int edgeThickness = 10; 
      int imagesPerRow = ceil(double(N)/nRows); 
      int resizeHeight = floor(2.0 * ((floor(double(windowHeight - edgeThickness)/nRows))/2.0)) - edgeThickness; 
      int maxRowLength = 0; 

      std::vector<int> resizeWidth; 
      for (int i = 0; i < N;) { 
        int thisRowLen = 0; 
        for (int k = 0; k < imagesPerRow; k++) { 
          double aspectRatio = double(vecMat[i].cols)/vecMat[i].rows; 
          int temp = int(ceil(resizeHeight * aspectRatio)); 
          resizeWidth.push_back(temp); 
          thisRowLen += temp; 
          if (++i == N) break; 
        } 
        if ((thisRowLen + edgeThickness * (imagesPerRow + 1)) > maxRowLength) { 
          maxRowLength = thisRowLen + edgeThickness * (imagesPerRow + 1); 
        } 
      } 
      int windowWidth = maxRowLength; 
      cv::Mat canvasImage(windowHeight, windowWidth, CV_8UC3, Scalar(0, 0, 0)); 

      for (int k = 0, i = 0; i < nRows; i++) { 
        int y = i * resizeHeight + (i + 1) * edgeThickness; 
        int x_end = edgeThickness; 
        for (int j = 0; j < imagesPerRow && k < N; k++, j++) { 
          int x = x_end; 
          cv::Rect roi(x, y, resizeWidth[k], resizeHeight); 
          cv::Size s = canvasImage(roi).size(); 
          // change the number of channels to three 
          cv::Mat target_ROI(s, CV_8UC3); 
          if (vecMat[k].channels() != canvasImage.channels()) { 
           if (vecMat[k].channels() == 1) { 
            cv::cvtColor(vecMat[k], target_ROI, CV_GRAY2BGR); 
           } 
          } else {    
           vecMat[k].copyTo(target_ROI); 
          } 
          cv::resize(target_ROI, target_ROI, s); 
          if (target_ROI.type() != canvasImage.type()) { 
           target_ROI.convertTo(target_ROI, canvasImage.type()); 
          } 
          target_ROI.copyTo(canvasImage(roi)); 
          x_end += resizeWidth[k] + edgeThickness; 
        } 
      } 
      return canvasImage; 
    } 

다음은 샘플 출력입니다. Composite image made of multiple images

+0

어떻게 그레이 스케일 이미지를 표시 할 수 있습니까? 왜냐하면 저는 그것을 시도했기 때문에 컬러 이미지에만 적용됩니다. – Maystro

+1

@Maystro : 그레이 스케일 및 컬러 이미지를 지원하도록 코드를 수정했습니다. – vinvinod

+1

이것은 내가 생각하기에 가장 좋은 해결책입니다. 어쨌든 색상 이미지의 경우 target_ROI Mat에 vecMat [k] 데이터를 복사하는 것을 잊었 기 때문에 조금 수정해야했습니다. –

5

하거나 사용 :

Mat a, Mat b, Mat dst // a,b loaded 

cv::hconcat(a, b, dst) // horizontal 
cv::vconcat(a, b, dst) // vertical 

매트 DST를 -> | a | b |

또는 벡터와 함께 할 :

std::vector<cv::Mat> matrices = { 
      a, b 
    }; 
hconcat(matrices, dst); 
관련 문제