OpenCV   sample   Raspberry Pi   Qwatch


● VS2010: Visual Studio 2010でのOpenCV sample   OpeenCV 2.4.10

手元のWEBカメラでテスト

200万画素 BUFFALO BSW20KM01H 300万画素 ELECOM UCAM-DLY300TA 500万画素 iBUFFALO BSW50KM01H



1台のカメラ画像とグレイ、モノクロ変換で表示

       
    int w,h,key;

    CvCapture *cam=cvCreateCameraCapture(CV_CAP_ANY);       //カメラ初期化
    if (!cam){   
        printf("カメラが見つかりません.\n");
        return 1;
    }


    //カメラ用のウィンドウ
    char *winc="Camera";
    char *win1="Image1";
    char *win2="Image2";
        
    cvNamedWindow(winc,CV_WINDOW_AUTOSIZE); //カメラ ウィンドウ作成
    cvMoveWindow(winc,0,0);

    cvNamedWindow(win1,CV_WINDOW_AUTOSIZE); //グレイ ウィンドウ作成
    cvMoveWindow(win1,800,0);

    cvNamedWindow(win2,CV_WINDOW_AUTOSIZE); //モノクロ ウィンドウ作成
    cvMoveWindow(win2,800,550);
        
    // 直接画像サイズを指定する
    cvSetCaptureProperty (cam, CV_CAP_PROP_FRAME_WIDTH,  640);
    cvSetCaptureProperty (cam, CV_CAP_PROP_FRAME_HEIGHT, 480);
    CvSize imageSize = cvSize(640,480);
                
    IplImage* cam_img  = cvCreateImage(imageSize, IPL_DEPTH_8U,3);
    IplImage* gray_img = cvCreateImage(imageSize, IPL_DEPTH_8U,1); // グレースケール画像用にメモリを確保
    IplImage* wb_img   = cvCreateImage(imageSize, IPL_DEPTH_8U,1); // モノクロ用にメモリ確保

  
    while(1){
        key=cvWaitKey(1);
        if (key==0x1B) break;    //ESCキーで終了

        cam_img=cvQueryFrame(cam); //カメラ画像の取得
        if (cam_img) {
            cvCvtColor(cam_img, gray_img,CV_BGR2GRAY);      //カラーからグレーへ変換
            cvAdaptiveThreshold(gray_img, wb_img, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, 8);   

            cvShowImage(winc,cam_img);      //カメラ画像の表示
            cvShowImage(win1,gray_img);     //処理した画像の表示
            cvShowImage(win2,wb_img);       //処理した画像の表示
        }
    }

    //全てのウィンドウの削除
    cvDestroyAllWindows();

    //ウィンドウ関連解放処理
    cvDestroyWindow(winc);
    cvDestroyWindow(win1);
    cvDestroyWindow(win2);

    //カメラの開放
    cvReleaseCapture(&cam);

    //画像データの解放
    cvReleaseImage(&gray_img);
    cvReleaseImage(&wb_img);

    return 0;



1台のカメラ画像とグレイ、モノクロ変換で表示 (Mat)
    int c;
    IplImage* cam_img;
    cv::Mat mat_frame;
    cv::Mat mat_gray;
    cv::Mat mat_wb;  

    //カメラの初期化(カメラの選択)
    CvCapture *capture = cvCaptureFromCAM(0);
        if (!capture){   
        printf("カメラが見つかりません.\n");
        return 1;
    }

    //取込サイズの設定
    cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH,  640);
    cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, 480);
    CvSize imageSize = cvSize(640,480);

    //カメラ用のウィンドウ
    char *winc="Camera";
    char *win1="Image1";
    char *win2="Image2";

    //ウィンドウの作成
    cvNamedWindow (winc, CV_WINDOW_AUTOSIZE);
    cvMoveWindow(winc,0,0);

    cvNamedWindow(win1,CV_WINDOW_AUTOSIZE); //グレイ ウィンドウ作成
    cvMoveWindow(win1,800,0);

    cvNamedWindow(win2,CV_WINDOW_AUTOSIZE); //モノクロ ウィンドウ作成
    cvMoveWindow(win2,800,550);

        
    while (1) {
        //カメラ画像の取込
        cam_img = cvQueryFrame (capture);
   
       if (cam_img) {
            mat_frame = cv::Mat(cam_img,true);  // カメラ画像 IplImage -> Mat変換

            //カラーからグレーへ変換
            cv::cvtColor(mat_frame, mat_gray, CV_BGR2GRAY);
        
            // 白黒2値化
            cv::adaptiveThreshold(mat_gray, mat_wb, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 7, 8);


            //画像の表示
            cvShowImage (winc, cam_img);
            cv::imshow(win1, mat_gray);
            cv::imshow(win2, mat_wb);
        }

        //キー入力待ち(Escキーで終了)
        c = cvWaitKey (2);
        if (c == '\x1b') break;
    }

    //カメラの開放
    cvReleaseCapture (&capture);

    //全てのウィンドウの削除
    cvDestroyAllWindows();

    //ウィンドウ関連解放処理
    cvDestroyWindow (winc);
    cvDestroyWindow (win1);
    cvDestroyWindow (win2);

    return 0;



2台のカメラ画像の表示
    

    CvCapture *cam1=cvCreateCameraCapture(0);       //カメラ1初期化
    if(!cam1){
        printf("カメラ1が見つかりません.\n");
        return 1;
    }

    CvCapture *cam2=cvCreateCameraCapture(1);       //カメラ2初期化
    if(!cam2){
        printf("カメラ2が見つかりません.\n");
        return 1;
    }

    //カメラ用のウィンドウ
    char *winc1 ="Camera1";    //ウィンドウの名前
    char *winc2 ="Camera2";    //ウィンドウの名前
        
    cvNamedWindow(winc1,CV_WINDOW_AUTOSIZE); //カメラ1 ウィンドウ作成
    cvMoveWindow(winc1,0,0);
                
    cvNamedWindow(winc2,CV_WINDOW_AUTOSIZE); //カメラ2 ウィンドウ作成
    cvMoveWindow(winc2,800,0);

   
    IplImage *cam1_img=NULL;
    cam1_img=cvQueryFrame(cam1);         //カメラ画像取得1(サイズ取得のため)

    IplImage *cam2_img=NULL;
    cam2_img=cvQueryFrame(cam2);         //カメラ画像取得2(サイズ取得のため)

    while(1){
        int key = cvWaitKey(1);
        if (key == 0x1B) break;    // ESCキーで終了

        cam1_img=cvQueryFrame(cam1);   //カメラ画像1の取得
        cam2_img=cvQueryFrame(cam2);   //カメラ画像2の取得
                
        cvShowImage(winc1,cam1_img);   //カメラ画像1の表示
        cvShowImage(winc2,cam2_img);   //カメラ画像2の表示

       if (key == 's' ) {         // sキーで画像保管
              cvSaveImage("image/cam1img.bmp", cam1_img);  // imageフォルダーが存在すること!
              cvSaveImage("image/cam2img.bmp", cam2_img);
        }
    }


    //全てのウィンドウの削除
    cvDestroyAllWindows();

    //ウィンドウ関連解放処理
    cvDestroyWindow(winc1);
    cvDestroyWindow(winc2);

        
    //カメラの開放
    cvReleaseCapture(&cam1);
    cvReleaseCapture(&cam2);

    return 0;



赤色の検出
    

    int i,r,g,b,nWidth,nHeight,pixcel_count;
    char szMsg[256]={""};
      
    printf("*** START ***\n");

    CvCapture *cam=cvCreateCameraCapture(CV_CAP_ANY);       //カメラ初期化
    if(!cam){
        printf("カメラが見つかりません.\n");
        return 1;
    }

    //カメラ用のウィンドウ
    char *winc="Camera";
    char *win1="Image1";
    char *win2="Image2";
        
    cvNamedWindow(winc,CV_WINDOW_AUTOSIZE); //カメラ ウィンドウ作成
    cvMoveWindow(winc,0,0);

    cvNamedWindow(win1,CV_WINDOW_AUTOSIZE); //グレイ ウィンドウ作成
    cvMoveWindow(win1,800,0);

    cvNamedWindow(win2,CV_WINDOW_AUTOSIZE); //モノクロ ウィンドウ作成
    cvMoveWindow(win2,800,550);
        
  

    IplImage *cam_img=NULL;
    IplImage *bak_img=NULL;
    cam_img = cvQueryFrame(cam);   //カメラ画像取得(サイズ取得のため)
    nWidth  = cam_img->width;
    nHeight = cam_img->height;
    sprintf_s(szMsg, "w=%d  h=%d\n", nWidth, nHeight);
    printf(szMsg); 

  // グレースケール画像用にメモリを確保
    IplImage* gray_img = cvCreateImage(cvGetSize(cam_img), IPL_DEPTH_8U,1);

  // モノクロ用にメモリ確保
    IplImage* wb_img = cvCreateImage(cvGetSize(cam_img), IPL_DEPTH_8U, 1); 

  // 結果用にメモリ確保
    IplImage* result_img = cvCreateImage(cvGetSize(cam_img), IPL_DEPTH_8U, 3); 


   
   //検出色の定義 (各チャンネルの画素値の上限と下限を二次元配列に格納)
    int iro[][2]= { {200,255},  // R
                    {  0, 50},  // G 
                    {  0, 50}   // B
             };

   // 画像データアクセス用のポインタ作成
    unsigned char **image;
    image = new unsigned char *[nHeight];
    for(i=0; i<nHeight; i++) {
        image[i] = (unsigned char *)cam_img->imageData + i*cam_img->widthStep;
    }

   // 結果アクセス用のポインタ作成
    unsigned char **image2;
    image2 = new unsigned char *[nHeight];
    for(i=0; i<nHeight; i++) {
        image2[i] = (unsigned char *)result_img->imageData + i*result_img->widthStep;
    }

    while(1){
       int key=cvWaitKey(1);
       if (key==0x1B) break;    //ESCキーで終了

       cam_img=cvQueryFrame(cam); //カメラ画像の取得

       cvCvtColor(cam_img, gray_img,CV_BGR2GRAY);      //カラーからグレーへ変換
   //  cvAdaptiveThreshold(gray_img, wb_img, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 7, 8);   

       pixcel_count = 0;

       for( int y=0 ; y<nHeight; y++) {
           for( int x=0; x<nWidth; x++) {
               r = image[y][x*3+2];  // 座標(x,y)のR
               g = image[y][x*3+1];  // 座標(x,y)のG
               b = image[y][x*3];    // 座標(x,y)のB

               if( ( iro[2][0] <= b) && ( b <=iro[2][1]) &&   // B
                   ( iro[1][0] <= g) && ( g <=iro[1][1]) &&   // G
                   ( iro[0][0] <= r) && ( r <=iro[0][1]) ) {  // R
                   pixcel_count++;
                   image2[y][x*3+2] = 255;
                   image2[y][x*3+1] = 0;
                   image2[y][x*3]   = 0;
               }
               else {
                   image2[y][x*3+2] = 0;
                   image2[y][x*3+1] = 0;
                   image2[y][x*3]   = 0;
               }
           }
       }

       sprintf_s(szMsg, "count=%d\n", pixcel_count);
       printf(szMsg); 

       cvShowImage(winc,cam_img);      //カメラ画像の表示
       cvShowImage(win1,gray_img);     //処理した画像の表示
       cvShowImage(win2,result_img);   //処理した画像の表示
   }

    //全てのウィンドウの削除
    cvDestroyAllWindows();

    //ウィンドウ関連解放処理
    cvDestroyWindow(winc);
    cvDestroyWindow(win1);
    cvDestroyWindow(win2);

    //カメラの開放
    cvReleaseCapture(&cam);

    //画像データの解放
    cvReleaseImage(&gray_img);
    cvReleaseImage(&wb_img);
    cvReleaseImage(&result_img);

    // 画像データアクセスに使った配列を開放
    delete [] image;
    delete [] image2;

    printf("*** END ***\n");

    return 0;

▲ 上へ



CRIMSON Systems Homeへ Copyright (C) CRIMSON Systems