检测直线:cvHoughLines,cvHoughLines2
检测矩形:opencv中没有对应的函数,下面有段代码可以检测矩形,是通过先找直线,然后找到直线平行与垂直的四根线。
检测直线代码:
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char** argv)
{
const char*filename = argc >= 2 ? argv[1] : "pic1.png";
IplImage*src = cvLoadImage( filename, 0 );
CvMemStorage* storage = cvCreateMemStorage(0);
dst =cvCreateImage( cvGetSize(src), 8, 1 );
color_dst =cvCreateImage( cvGetSize(src), 8, 3 );
cvCanny(src, dst, 50, 200, 3 );
cvCvtColor(dst, color_dst, CV_GRAY2BGR );
#if 0
lines =cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100,0, 0 );
for( i = 0;i < MIN(lines->total,100); i++ )
float* line= (float*)cvGetSeqElem(lines,i);
float rho = line[0];
float theta = line[1];
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000*(-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000*(a));
cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 );
#else
lines =cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180,50, 50, 10 );
for( i = 0;i < lines->total; i++ )
CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0);
#endif
cvNamedWindow( "Source", 1 );
cvShowImage("Source", src );
cvNamedWindow( "Hough", 1 );
cvShowImage("Hough", color_dst );
}
检测圆代码:
#include <cv.h>
#include <highgui.h>
#include <math.h>
int main(int argc, char** argv)
{
if( argc ==2 && (img=cvLoadImage(argv[1],1))!= 0)
IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
CvMemStorage* storage = cvCreateMemStorage(0);
cvCvtColor( img, gray, CV_BGR2GRAY );
cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // smooth it, otherwisea lot of false circles may be detected
CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT,2, gray->height/4, 200, 100 );
for( i = 0; i < circles->total; i++)
float* p = (float*)cvGetSeqElem( circles, i );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3,CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]),CV_RGB(255,0,0), 3, 8, 0 );
cvNamedWindow( "circles", 1 );
cvShowImage( "circles", img );
}