OpenGL de プログラミング - sequence編02::まとめ2
現在地 >> メニュー >> OpenCV >> sequence編02 >> sequence編02::まとめ2

問題

画像を読み込んで、確率的ハフ変換によって直線を検出せよ

答え

#include <iostream>
#include <cv.h>
#include <highgui.h>

#pragma comment(lib,"cv200.lib")
#pragma comment(lib,"cxcore200.lib")
#pragma comment(lib,"highgui200.lib")

const char *filename = "testimg.png";

int main()
{
	IplImage *imgA = cvLoadImage(filename,0);
	if(imgA ==NULL )
	{
		std::cerr << "Can't load image\n";
		return -1;
	}

	cvCanny(imgA,imgA,50,200,3);

	//メモリストレージとシーケンスを用意
	CvMemStorage* storage = cvCreateMemStorage(0);
	CvSeq* lines = 0;
	//ハフ変換による直線の検出(確率的)
	lines = cvHoughLines2( imgA,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,80,30,10 );

	IplImage *imgA_out = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_8U,3);
	cvCvtColor(imgA,imgA_out,CV_GRAY2RGB);//直線描画用

	CvPoint *line;


	for(int loop = 0; loop < MIN(lines->total,100);++loop)
	{
		line = reinterpret_cast<CvPoint *>( cvGetSeqElem(lines,loop) );
		cvLine(imgA_out, line[0], line[1], CV_RGB(255,0,0), 3, 8 );
	}

	cvNamedWindow("CV_HOUGH_PROBABILISTIC");
	cvShowImage("CV_HOUGH_PROBABILISTIC",imgA_out);

	cvWaitKey();

	cvReleaseImage(&imgA);
	cvReleaseImage(&imgA_out);
	cvReleaseMemStorage( &storage ); //cvReleaseImageなどと同じようなもの
	cvDestroyAllWindows();

	return 0;
}