OpenCVでカメラを使う時の標準プログラム(C対応)

Last-modified: 2011-03-16 (水) 16:30:34

目次


today: ?
yesterday: ?
total: ?

更新履歴

2011/01/25

  • tarの更新
  • 出力結果画像の変更
  • ファイル構成の更新
  • mainの更新

2011/02/21

  • プログラムの更新(詳細はtar.bzの中のReadmeを参照)

2011/02/24

  • プログラムの更新(詳細はtar.bzの中のReadmeを参照)

ファイル構成と簡単な説明

  • data/
    • data/init/: 設定ファイルを置く場所
      • data/init/webcamInit.dat
    • data/Makefile
    • data/time: 測定時間を置く場所
    • data/img: 画像を置く場所
      • data/img/lena.jpg
      • data/img/logo.png
      • data/debug/: 端末出力結果を置く場所
        Readme.txt: 更新履歴はここ
  • include/: ライブラリ関係のリンクはここ
    • include/Makefile
    • include/myCV.h
    • include/myLibs.h
  • lib/: ライブラリ関係はここ
    • lib/logSave/ 入出力関係はここ
      • lib/logSave/Readme.txt: 関数の使い方
      • lib/logSave/logSave.h
      • lib/logSave/Makefile
      • lib/logSave/saveData.c
      • lib/logSave/readData.c
      • lib/logSave/getTime.c
    • lib/excv/: OpenCV/Libwebcam関係はここ
      • lib/excv/Readme.txt: 関数の使い方
      • lib/excv/Makefile
      • lib/excv/cannyEdge.c
      • lib/excv/libwebcam.c
      • lib/excv/csub.h
      • lib/excv/histogram.c
      • lib/excv/houghCircle.cpp
      • lib/excv/excvInit.c
      • lib/excv/excvInit.h
  • src/
    • src/Makefile
    • src/main.c

main関数の流れ

/*><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><
  main.c
  Time-stamp: <2011-01-25 11:01:23 kato>

  USBカメラから画像を取得するだけのプログラム.
  カメラを検出できなかった場合は画像を読み込み表示する.
  ><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><*/

#include
#include
#include

/// EXCV_NOCAP or EXCV_CAP
#define

int standard(char *filename);

int main(int argc, char** argv){
  char* filename = argc == 2 ? argv[1] : (char*)"../data/img/lena.jpg";
  standard(filename);
  return 0;
}

int standard(char *filename){
  int key;
  /// OpenCV structure
  CvSize imgSize = {640, 480};
  CvCapture* cap;
  IplImage* src  = cvCreateImage(imgSize, IPL_DEPTH_8U, 3);
  IplImage* gray = cvCreateImage(imgSize, IPL_DEPTH_8U, 1);
  IplImage* hist;
  /// original structure
  GetTime gt = {0};
  PointNum pn = {0};

  if(!(cap = cvCaptureFromCAM(0))){
    puts("[ERROR] Camera is not found !!");

    IplImage* jpgImg;
    excvMakeWin("Sample image", EXCV_AUTO);
    if((jpgImg = cvLoadImage(filename, 1)) == NULL){
      puts("[ERROR] Image is not found !!");
      return -1;
    }
    excvSaveImg(jpgImg, "jpg");
    excvCanny(jpgImg);
    pn = excvHoughC(jpgImg);
    cvShowImage("Sample image", jpgImg);/// show capture image
    key = excvWaitKey(0);
    excvSaveImg(jpgImg, "jpg");
    cvReleaseImage(&jpgImg);
    cvReleaseImage(&gray);
    cvReleaseImage(&hist);

    return 0;
  }

  CHandle hDevice = webcamInitCamParam("video0", 0);/// libwebcam init
  excvMakeWin("USB camera capture", 0);/// make window
  excvMakeWin("Histogram image", EXCV_AUTO);/// make window

  while(1){
    getTime(0, 0, &gt);/// time check start
    src = cvQueryFrame(cap);/// USB camera capture
    cvCvtColor(src, gray, CV_RGB2GRAY);
    getTime(0, 1, &gt);/// time check end

    getTime(1, 0, &gt);/// time check start
    hist = excvHistogram(hDevice, gray);
    excvCanny(src);
    pn = excvHoughC(src);
    getTime(1, 1, &gt);/// time check end

    getTime(2, 0, &gt);/// time check start
    cvShowImage("USB camera capture", src);/// show capture image
    cvShowImage("Histogram image", hist);/// show capture image
    getTime(2, 1, &gt);/// time check end
    key = excvWaitKey(2);
    gt.loop++;
    if(key == EXCV_BREAK || key == EXCV_CAP || gt.flag == 1)
      break;
    if(key > WC_CAM){
      webcamPanTilt(hDevice, key, 1024);
      excvSaveImg(src, "jpg");
    }
  }

  excvSaveImg(src, "jpg");
  excvSaveImg(gray, "jpg");
  excvSaveImg(hist, "jpg");
  saveTime(&gt);

  webcamReleaseDevice(hDevice);
  cvReleaseImage(&src);
  cvReleaseImage(&gray);
  cvReleaseImage(&hist);
  cvReleaseCapture(&cap);
  return 0;
}

結果(USBカメラなしの場合)

  • 入力画像

before.jpg

  • 出力画像
    • excvCannyで縁取り
    • excvHoughCで円を検出

after.jpg