VirtualBoxにてUSBカメラから画像入力をし、OpenCVを用いて解析したいです。以下のコードで実行を押すと本来は処理前と処理後の二つの画像が表記されるのですがコンソールで "select timeout”となり画面が表示されません。
初投稿、C言語に疎いこともあり、情報不足かもしれませんが、ご教示お願い致します。
・ノートPC: LAPTOP-ODFTF93F
・カメラ:ELECOM 2.0MP AUTO FOCUS Web Camera (有効画素数:約200万画素)
• IDE: Eclipse 4.2 (Juno), C/C++ 開発ツール (CDT), 日本語化プラグイン (Pleiades)
• 画像処理ライブラリ: OpenCV 2.4.6.1
以下、ソースコード
- grayconv.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <opencv2/core/core_c.h>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui_c.h>
#define WIDTH 640 // 画像の水平画素数
#define HEIGHT 480 // 画像の垂直画素数
char win_src[] = "処理前", win_dst[] = "処理後"; // ウィンドウの名前
int main(void)
{
// ビデオキャプチャのための構造体
CvCapture *cap;
// 画像データのための構造体
IplImage *img_orig, *img_src, *img_dst;
// i, j: 画像配列の添字, val: 画素値
int i, j;
unsigned char val;
// ビデオキャプチャの構造体の初期化 if ((cap = cvCaptureFromCAM(0))== NULL) { printf("有効なカメラが見つかりません!\n"); return (1); } cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, WIDTH); cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, HEIGHT); // 画像データのメモリ確保および初期化 (符号なし8ビット×1チャンネル) img_src = cvCreateImage(cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1); img_dst = cvCreateImage(cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1); // ウィンドウの作成 cvNamedWindow(win_src, CV_WINDOW_AUTOSIZE); cvNamedWindow(win_dst, CV_WINDOW_AUTOSIZE); cvMoveWindow(win_dst, WIDTH, 0); // ウィンドウの位置を右にずらす // フレーム単位の処理のためのループ while (1) { // 1フレーム分キャプチャ img_orig = cvQueryFrame(cap); // 入力画像はカラーなのでグレイスケール画像に変換 cvCvtColor(img_orig, img_src, CV_BGR2GRAY); // (i, j) を画面全体で走査させるためのループ for (i = 0; i < HEIGHT; i++) { for (j = 0; j < WIDTH; j++) { // 画像 img_src の画素 (i, j) の輝度値を取得 val = img_src->imageData[img_src->widthStep * i + j]; // しきい値処理 if (val < 128) { val = 0; } else { val = 255; } // 画像 img_dst の画素 (i, j) の輝度値を更新 img_dst->imageData[img_dst->widthStep * i + j] = val; } } // 結果をウィンドウに表示 cvShowImage(win_src, img_src); cvShowImage(win_dst, img_dst); // "q" キーが押されたらループを抜ける if ((cvWaitKey(10) & 0xff) == 'q') break; } // 確保したメモリの開放 cvReleaseCapture(&cap); cvReleaseImage(&img_src); cvReleaseImage(&img_dst); cvDestroyWindow(win_src); cvDestroyWindow(win_dst); return (0);
}
あなたの回答
tips
プレビュー