OpenCVを用いて、webカメラ画像をセピア表示する
重い。
while(1)の中は、あまり処理を書きたくないです。
ですが、画像を取り込んでそのサイズに応じた画像を作らなくてはならないので、
whileの中はこんな感じ。
もっと簡単にかける方教えてください。
#include
#include
#include
#include
#include#define DEFAULT_H 22//H値を置き換える値
#define DEFAULT_S 90//S値を置き換える値
int main (void)
{
CvCapture *capture = 0;
IplImage *frame = 0;//取り込まれるカメラ画像
double w = 160, h = 120;
int c;// (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
// if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
capture = cvCreateCameraCapture (0);/* この設定は,利用するカメラに依存する */
// (2)キャプチャサイズを設定する.
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
CvScalar valueH = cvScalar(DEFAULT_H);
CvScalar valueS = cvScalar(DEFAULT_S);// (3)カメラから画像をキャプチャする
while (1) {
//画像1フレーム分もってくる
frame = cvQueryFrame (capture);
CvSize sizeOfImage = cvGetSize( frame );IplImage *hsvImage = cvCreateImage(sizeOfImage,IPL_DEPTH_8U,3 ); // HSV画像用IplImage
IplImage *hueImage = cvCreateImage(sizeOfImage,IPL_DEPTH_8U,1); // 色相(H)情報用IplImage
IplImage *saturationImage = cvCreateImage(sizeOfImage,IPL_DEPTH_8U,1); // 彩度(S)情報用IplImageIplImage *valueImage = cvCreateImage(sizeOfImage,IPL_DEPTH_8U,1); // 明度(V)情報用IplImage
IplImage *mergeImage = cvCreateImage(sizeOfImage,IPL_DEPTH_8U,3 ); // マージ用IplImage
IplImage *sepiaframe = cvCreateImage(sizeOfImage,IPL_DEPTH_8U,3 );
//BGRからHSVに変換する
cvCvtColor(frame, hsvImage, CV_BGR2HSV );
//HSV画像をH、S、V画像に分けるcvSplit( hsvImage, hueImage, saturationImage, valueImage, NULL );
//HとSの値を変更する
cvSet( hueImage, valueH, NULL );
cvSet( saturationImage, valueS, NULL );
//3チャンネルを結合
cvMerge( hueImage, saturationImage, valueImage, NULL, mergeImage );
//HSVからBGRに変換するcvCvtColor(mergeImage,sepiaframe,CV_HSV2BGR);
//Captureってウィンドにframe画像を表示
cvShowImage ("Capture", sepiaframe);c = cvWaitKey (10);
if (c == '\x1b'){
cvReleaseImage(&hsvImage);
cvReleaseImage(&hueImage);
cvReleaseImage(&saturationImage);cvReleaseImage(&valueImage);
cvReleaseImage(&mergeImage);
cvReleaseImage(&sepiaframe);
break;}
}cvReleaseImage(&frame);
cvReleaseCapture (&capture);
cvDestroyWindow ("Capture");return 0;
}