2017-02-13 10 views
0

OpenCVを使用して画像をロードして、ウィンドウに表示したい。C++ opencvウィンドウに画像を表示する

私はopencvを使ってイメージを読み込む方法と、win32を使ってウィンドウを作成する方法を知っていますが、その後Opencvのイメージ/マットをウィンドウに置く方法はありますか?

これは私がOpenCVのからイメージをロードする方法である:

#include <opencv2/core/core.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/highgui/highgui.hpp> 

#include <iostream> 
#include <string> 
using namespace cv; 

using namespace std; 

int main(int argc, char** argv) 
{ 

    string imageName("C:/image.jpg"); // by default 
    if (argc > 1) 
    { 
     imageName = argv[1]; 
    } 

    Mat image; 



    image = imread(imageName.c_str(), IMREAD_COLOR); 


    if (image.empty())  
    { 
     cout << "Could not open or find the image" << std::endl; 
     return -1; 
    } 


    namedWindow("Display window", WINDOW_AUTOSIZE); 

    imshow("Display window", image); 


    waitKey(0); 
    return 0; 
} 

編集:私はこれをしたい理由は、実際に実行時にウィンドウを作成し、それに画像を表示するのではなく、むしろI Win32のFindWindow関数を使用してウィンドウを検索し、その上に像を描きたい:D

+0

「imshow」の何が問題なのですか? – Miki

+0

何もない、私はちょうどwin32ウィンドウ上のopencvから画像を表示する方法を知っているだろう:) – stav

+1

しかし、...それはwin32ウィンドウ..;) – Miki

答えて

0

うーん...

は「namedWindowを()」を呼び出すことによって、新しいウィンドウを作成しないでください。

imshow(nameOfExistingWindow, image)を呼び出します。

となります。

+0

ありがとうございますが、実際に描画するウィンドウには名前がなく、私が持っているのはそのHWNDです:( – stav

0

私はこれを私のMFCプロジェクトでかなり頻繁に使用しています。 CWndではなくhwndしか持っていない場合は、少し変更する必要があります。

これは、8ビットのRGBカラーと1チャンネルのモノクロ画像の両方で機能します。

void DrawImage(CWnd *wnd, int width, int height, int bpp, const unsigned char *buffer) 
{ 
    RECT rect; 
    wnd->GetWindowRect(&rect); 
    CDC *dc = wnd->GetDC(); 

    if(bpp == 3) // BGR 
    { 
     BITMAPINFO bmpinfo; 

     memset(&bmpinfo, 0, sizeof(bmpinfo)); 
     bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
     bmpinfo.bmiHeader.biBitCount = 24; 
     bmpinfo.bmiHeader.biClrImportant = 0; 
     bmpinfo.bmiHeader.biClrUsed = 0; 
     bmpinfo.bmiHeader.biCompression = BI_RGB; 
     bmpinfo.bmiHeader.biWidth = width; 
     bmpinfo.bmiHeader.biHeight = -height; 
     bmpinfo.bmiHeader.biPlanes = 1; 
     bmpinfo.bmiHeader.biSizeImage = 0; 
     bmpinfo.bmiHeader.biXPelsPerMeter = 100; 
     bmpinfo.bmiHeader.biYPelsPerMeter = 100; 

     ::SetStretchBltMode(dc->GetSafeHdc(), COLORONCOLOR); 
     ::StretchDIBits( dc->GetSafeHdc(), 
         0, 
         0, 
         rect.right - rect.left, 
         rect.bottom - rect.top, 
         0, 
         0, 
         width, 
         height, 
         buffer, 
         &bmpinfo, 
         DIB_RGB_COLORS, 
         SRCCOPY); 
    } 
    else if (bpp == 1) // monochrome. 
    { 
     char bitmapInfoBuf[sizeof(BITMAPINFO) + 4 * 256]; 
     BITMAPINFO* pBmpInfo = (BITMAPINFO*)bitmapInfoBuf; 

     memset(pBmpInfo, 0, sizeof(BITMAPINFO) + 4 * 256); 
     pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
     pBmpInfo->bmiHeader.biWidth = width; 
     pBmpInfo->bmiHeader.biHeight = -height; 
     pBmpInfo->bmiHeader.biCompression = BI_RGB; 
     pBmpInfo->bmiHeader.biPlanes = 1; 
     pBmpInfo->bmiHeader.biBitCount = 8; 

     for(int i = 0; i < 256; i++) 
     { 
      pBmpInfo->bmiColors[i].rgbBlue=i; 
      pBmpInfo->bmiColors[i].rgbGreen=i; 
      pBmpInfo->bmiColors[i].rgbRed=i; 
      pBmpInfo->bmiColors[i].rgbReserved=255; 
     } 

     ::SetStretchBltMode(dc->GetSafeHdc(), COLORONCOLOR); 
     ::StretchDIBits(dc->GetSafeHdc(), 
         0, 
         0, 
         rect.right - rect.left, 
         rect.bottom - rect.top, 
         0, 
         0, 
         width, 
         height, 
         buffer, 
         pBmpInfo, 
         DIB_RGB_COLORS, 
         SRCCOPY); 
    } 

    wnd->ReleaseDC(dc); 
} 

void DrawCVImage(cv::Mat image, CWnd *picture) 
{ 
    if (image.cols % 4 == 0) 
    { 
     DrawImage(picture, 
      image.cols, 
      image.rows, 
      image.channels() == 3 ? 3 : 1, 
      image.data); 
    } 
    else 
    { 
     Mat image2(image.rows, image.cols + (4 - image.cols % 4), image.type()); 
     image2 = 0; 
     image.copyTo(image2(Rect(0, 0, image.cols, image.rows))); 

     DrawImage(picture, 
      image2.cols, 
      image2.rows, 
      image2.channels() == 3 ? 3 : 1, 
      image2.data); 
    } 
} 
関連する問題