最終更新: mikk_ni3_92 2007年12月24日(月) 16:10:17履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::コーナー検出
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;
int main( int argc, char **argv)
{
IplImage *imgA = cvLoadImage( "test3.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(imgA ==NULL)
{
cout<<"Can't Load Image ." << endl;
std::exit(0);
}
/* 作業用グレイスケール */
IplImage *Gray = cvCreateImage( cvGetSize(imgA),IPL_DEPTH_8U,1);
cvCvtColor(imgA, Gray, CV_BGR2GRAY);
/* 一時的な変数 */
IplImage *tmp1 = cvCreateImage (cvGetSize (imgA), IPL_DEPTH_32F, 1);
IplImage *tmp2 = cvCreateImage (cvGetSize (imgA), IPL_DEPTH_32F, 1);
int corner_count = 150; //最大で150個のコーナーを想定。
CvPoint2D32f *corners;
corners = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
/* エッジ検出*/
cvGoodFeaturesToTrack(Gray,tmp1,tmp2,corners, &corner_count,0.1, 15);
cvReleaseImage( &tmp1 );
cvReleaseImage( &tmp2 );
cout << corner_count << " Corners ." <<endl;
/* 高精度化 */
cvFindCornerSubPix (Gray, corners, corner_count,cvSize (3, 3), cvSize (-1, -1), cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));
cvReleaseImage( & Gray );
/* 出力 */
for (int i = 0; i < corner_count; i++)
{
cvCircle (imgA, cvPointFrom32f (corners[i]), 3, CV_RGB (255, 255, 0), 1);
}
cvFree(&corners);
cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);
cvWaitKey(0); // 0秒待つ => ずっと入力待ち
cvReleaseImage( &imgA );
cvDestroyWindow("window");
return 0;
}
「コーナー検出」は「グレイスケール画像」に対して行う。
cvGoodFeaturesToTrack関数
http://opencv.jp/opencv/document/opencvref_cv_grad...
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;
int main( int argc, char **argv)
{
IplImage *imgA = cvLoadImage( "test3.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(imgA ==NULL)
{
cout<<"Can't Load Image ." << endl;
std::exit(0);
}
/* 作業用グレイスケール */
IplImage *Gray = cvCreateImage( cvGetSize(imgA),IPL_DEPTH_8U,1);
cvCvtColor(imgA, Gray, CV_BGR2GRAY);
/* 一時的な変数 */
IplImage *tmp1 = cvCreateImage (cvGetSize (imgA), IPL_DEPTH_32F, 1);
IplImage *tmp2 = cvCreateImage (cvGetSize (imgA), IPL_DEPTH_32F, 1);
int corner_count = 150; //最大で150個のコーナーを想定。
CvPoint2D32f *corners;
corners = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
/* エッジ検出*/
cvGoodFeaturesToTrack(Gray,tmp1,tmp2,corners, &corner_count,0.1, 15);
cvReleaseImage( &tmp1 );
cvReleaseImage( &tmp2 );
cout << corner_count << " Corners ." <<endl;
/* 高精度化 */
cvFindCornerSubPix (Gray, corners, corner_count,cvSize (3, 3), cvSize (-1, -1), cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));
cvReleaseImage( & Gray );
/* 出力 */
for (int i = 0; i < corner_count; i++)
{
cvCircle (imgA, cvPointFrom32f (corners[i]), 3, CV_RGB (255, 255, 0), 1);
}
cvFree(&corners);
cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);
cvWaitKey(0); // 0秒待つ => ずっと入力待ち
cvReleaseImage( &imgA );
cvDestroyWindow("window");
return 0;
}
「コーナー検出」は「グレイスケール画像」に対して行う。
cvGoodFeaturesToTrack関数
http://opencv.jp/opencv/document/opencvref_cv_grad...