ここから本文です

OpenCVでWebカメラを使ってSURFによる特徴点の抽出を行いたいと思っています。 し...

hat********さん

2015/3/2500:16:03

OpenCVでWebカメラを使ってSURFによる特徴点の抽出を行いたいと思っています。
しかし、エラーが出てしまいうまく動作しません。
何が原因なのでしょうか?

解決策をよろしくお願いします。

OpenCVのバージョンは2.4.5です。
なお、エラー画面を画像に添付しています。

#include <iostream>
#include "cvlib_245.h"

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include<opencv2/nonfree/nonfree.hpp>
#include "opencv2/features2d/features2d.hpp"
#include <opencv2/legacy/legacy.hpp>
#include <opencv2/opencv.hpp>
#include <fstream>

using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
CvCapture* capture;
capture = cvCreateCameraCapture(0);
//// カメラを初期化
if ((capture = cvCreateCameraCapture(0)) == NULL) {
cerr << "cannot find camera" << endl;

return -1;
}

// ウィンドウを生成
cvNamedWindow("SURF");

IplImage* captureImage = cvQueryFrame(capture);
while (true) {
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* imageKeypoints = 0;
CvSeq* imageDescriptors = 0;
CvSURFParams params = cvSURFParams(500, 1);

captureImage = cvQueryFrame(capture);

// グレースケールに変換
IplImage* grayImage = cvCreateImage(cvGetSize(captureImage), 8, 1);
cvCvtColor(captureImage, grayImage, CV_BGR2GRAY);

// フレーム画像からSURFを取得
cvExtractSURF(grayImage, 0, &imageKeypoints, &imageDescriptors, storage, params);

// 画像にキーポイントを描画
for (int i = 0; i < imageKeypoints->total; i++) {
CvSURFPoint* point = (CvSURFPoint*)cvGetSeqElem(imageKeypoints, i); // i番目のキーポイント
CvPoint center; // キーポイントの中心座標
center.x = cvRound(point->pt.x);
center.y = cvRound(point->pt.y);
cvCircle(captureImage, center, 2, cvScalar(0,255,255), CV_FILLED);
}
cvShowImage("SURF", captureImage);

// ループ内で作成したオブジェクトは始末
cvReleaseImage(&grayImage);
cvClearSeq(imageKeypoints);
cvClearSeq(imageDescriptors);
cvReleaseMemStorage(&storage);

// ESCキーが押されたらループを抜ける
int key = cvWaitKey(30);
if (key == 27) {
break;
}
}

// 後始末
cvReleaseCapture(&capture);
cvDestroyAllWindows();

return 0;
}

captureImage,imageKeypoints,grayImage,opencv2,cvQueryFrame,OpenCV2.4以降,モジュール

閲覧数:
714
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

fun********さん

2015/3/2517:11:22

OpenCV2.4以降、ライセンスの関係で
そのままでは使えないようにしてあるようです

cv::initModule_nonfree();
をSURFの関数を呼ぶ前に上記1行を記述し
モジュールを初期化すると動作します
whileループの前あたりで良いかと思います

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる