2つのプログラムを結合させるには?


ビックマン  URL  2005-12-02 04:07:23  No: 59854

ダイアログボックスを表示するプログラムと、カメラ画像を表示するプログラムを結合したいのですがうまくいきません。2つのプログラムを記載しておきますので、よろしかったら教えてください。
普通にダイアログボックスとカメラ画像CaptureとOutputがぞれぞれ表示されるようになっていればかまいません。
カメラ画像を表示するプログラムはURLのページにカメラ利用の基本形として記載されています。

よろしくお願いします。


ビックマン  2005-12-02 04:08:30  No: 59855

カメラ画像表示プログラム

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main(int argc, char** argv)

  int key;
  CvCapture* capture = NULL;
  IplImage*  captureImage = NULL;
  IplImage*  outputImage = NULL;
  
  if(NULL==(capture = cvCaptureFromCAM(-1)))
  {
    printf("カメラが見つかりません");
    return -1;
  }

  char* captureWindow = "Capture";
  char* outputWindow  = "Output";
  cvNamedWindow(captureWindow,  CV_WINDOW_AUTOSIZE); 
  cvNamedWindow(outputWindow,  CV_WINDOW_AUTOSIZE);
  
  while(1)
  {
    captureImage = cvQueryFrame(capture);
    outputImage = cvCloneImage(captureImage);
    
    /*
      captureImageを画像処理して,その結果をoutputImageに描くような画像処理をここに書く
    */
    
    cvShowImage(captureWindow, captureImage);
    cvShowImage(outputWindow, outputImage);
    
    cvReleaseImage(&outputImage);
    
    key = cvWaitKey(1);
    if (key == 0x1b)
    {
      break;
    }
  }
  
  cvReleaseCapture(&capture);
  cvDestroyWindow(captureWindow);
  cvDestroyWindow(outputWindow);

  return 0;
}


ビックマン  2005-12-02 04:15:17  No: 59856

ダイアログボックスのプログラム
(このプログラムはまだ完成していないので変なところが多々あると思います)

#include "windows.h"
#include "resource.h"

// 関数のプロトタイプ宣言
BOOL CALLBACK DlgWndProc(HWND, UINT, WPARAM, LPARAM);

// エントリポイント
int APIENTRY WinMain(HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int nCmdShow )
{
  
//ダイアログボックスを表示します
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgWndProc);

//戻り値を返します
return 0;

}
// (ダイアログボックス)ウインドウプロシージャ
BOOL CALLBACK DlgWndProc(HWND hWnd,
                         UINT message,
                         WPARAM wParam,
                         LPARAM lParam)
{
  TCHAR sBuff[80];
  int a, b, c, d, e, f, g, h, i;
  float fxyz, lxyz;
  static int ;
  

    // メッセージの種類に応じて処理を分岐します。
  switch (message) 
  {
    case WM_INITDIALOG:
    // ダイアログボックスが作成されたときの処理
      c = 0;
      return TRUE;
    case WM_COMMAND:
      // ボタンが押されたときの処理
      switch (LOWORD(wParam))
      {

    case IDC_BUTTON7:
    // [計算実行]ボタン
    GetWindowText(GetDlgItem(hWnd,IDC_EDIT1), sBuff, 79);
    a = atoi(sBuff);
    GetWindowText(GetDlgItem(hWnd,IDC_EDIT2), sBuff, 79);
    b = atoi(sBuff);
    GetWindowText(GetDlgItem(hWnd,IDC_EDIT3), sBuff, 79);    

            c = a + b;
            wsprintf(sBuff, "%d", c);
            SetWindowText(GetDlgItem(hWnd,IDC_EDIT10), sBuff);

            c = a + b;
    wsprintf(sBuff, "%d", c);
    SetWindowText(GetDlgItem(hWnd,IDC_EDIT11), sBuff);

    c = a + b;
    wsprintf(sBuff, "%d", c);
    SetWindowText(GetDlgItem(hWnd,IDC_EDIT12), sBuff);

                    return TRUE;

    case IDC_BUTTON8:
            // [閉じる]ボタン
    SendMessage(GetParent(hWnd), WM_COMMAND, wParam, c);
    EndDialog(hWnd, 0);
    return TRUE;

            default:
    return FALSE;
  }
    default:
  return FALSE;

  }
}


επιστημη  2005-12-02 07:11:15  No: 59857

どのように結合するのかわかりません。
カメラ画像表示部をWindowsの流儀に従わせるところからでしょう。


シャノン  2005-12-02 20:01:26  No: 59858

キャプチャプログラムは OpenCV なるものを使っているらしい。


επιστημη  2005-12-02 20:47:07  No: 59859

んー… ならば後者をOpenCVの流儀に従わせるのでしょうねぇ。


ビックマン  2005-12-03 03:04:27  No: 59860

すみません、私にはやはりよく分からないので質問を変えたいと思います。

#include "windows.h"
#include "resource.h"

// 関数のプロトタイプ宣言
BOOL CALLBACK DlgWndProc(HWND, UINT, WPARAM, LPARAM);

// エントリポイント
int APIENTRY WinMain(HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int nCmdShow )
{
    
//ダイアログボックスを表示します
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgWndProc);

//戻り値を返します
return 0;

}
// (ダイアログボックス)ウインドウプロシージャ
BOOL CALLBACK DlgWndProc(HWND hWnd,
                         UINT message,
                         WPARAM wParam,
                         LPARAM lParam)
{
    int c;

    // メッセージの種類に応じて処理を分岐します。
    switch (message) 
    {
        case WM_INITDIALOG:
        // ダイアログボックスが作成されたときの処理
            c = 0;
            return TRUE;
        case WM_COMMAND:
            // ボタンが押されたときの処理
            switch (LOWORD(wParam))
            {

        case IDC_BUTTON1:
        
        case IDC_BUTTON2:
              // [閉じる]ボタン
        SendMessage(GetParent(hWnd), WM_COMMAND, wParam, c);
        EndDialog(hWnd, 0);
        return TRUE;

              default:
        return FALSE;
    }
        default:
    return FALSE;
    }
}

のBUTTON1をクリックした場合にUSBカメラをリアルタイムに表示させるにはどうすればいいでしょうか?
聞いてばかりで申し訳ないのですが、本当に分からないのでよろしくお願いします。


επιστημη  2005-12-03 03:38:59  No: 59861

まずはOpenCVのページをじっくり読んではいかがですか?


通りすがり  2005-12-30 11:14:12  No: 59862

通りすがりのものです。(いろいろぐぐっててたまたま流れ着きました)
タイムスタンプが若いんで書き込ませてもらいます。

リアルタイムで表示との事ですが、ボタンを押すことでキャプチャを行うスレッド(captureImage = cvQueryFrame(capture);とか)を立ててダイアログの方はタイマーで画像を再描画するようにしたらいいかもしれません。
このとき、IplImageをDIBに変換する必要があります。自分で作ることもできます田IPLというライブラリを使うと簡単にできます。

また、cvcam(obsolateかtestingらしい?)を使えば、表示領域のHWNDを指定することでオーバーレイによるプレビュー表示が簡単にできます。

この辺の議論は2chのプログラム板の画像処理に質問を投げるといいかもしれません。
OpenCV使いが何人かいるみたいですよ。


まもう  2006-03-12 23:19:31  No: 59863

通りすがりです。ググってたら。
まだ探しておられるようでしたら、たまたま同じようなソースを書いたんで参考までに晒しますけど、もう解決したのかな?
僕の場合はカメラじゃなくて、DirectShowも合体させて動画から読み込んでるんですけど。


質問A  2006-09-01 01:36:22  No: 59864

すいません。上記の方と同じ質問なのですが、もしよかったらまもうさんのソースを見せてもらえないでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加