#ifdef _CH_
#pragma package<opencv>
#endif
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cvcam.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
#include <cv.h>
#include <cvcam.h>
#include <math.h>
#include <cxcore.h>
#include <highgui.h>
void main()
{
//将图像转换为单通道,并作为源图像载入
IplImage *src_image=cvLoadImage("1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
if (NULL==src_image) return;
//创建单通道的目标图像
IplImage *dst_gray_image=cvCreateImage(cvGetSize(src_image),src_image->depth,1);
if (NULL==dst_gray_image) return;
//创建三通道的目标图像
IplImage *dst_color_image=cvCreateImage(cvGetSize(src_image),src_image->depth,3);
if (NULL==dst_color_image) return;
//显示单通道的源图像
cvNamedWindow("Show_Src",CV_WINDOW_AUTOSIZE);
cvShowImage("Show_Src",src_image);
//执行canny检测
cvCanny(src_image,dst_gray_image,50,200,3);
if (NULL==dst_gray_image) return;
//将单通道的目标图像转换为三通道
cvCvtColor(dst_gray_image,dst_color_image,CV_GRAY2BGR);
if (NULL==dst_color_image) return;
//初始化执行霍夫线性变换所需的数据
CvSeq *lines=0;
CvMemStorage *storage=cvCreateMemStorage(0);
if (NULL==storage) return;
//执行霍夫线性变换
#if 0
lines=cvHoughLines2(src_image,
storage,
CV_HOUGH_STANDARD,
1,
CV_PI/180,
100,
0,
0);
assert(lines!=NULL);
for (int i = 0;i < MIN(lines->total,100); i++)
{
float *line=(float*)cvGetSeqElem(lines,i);
float roi=line[0];
float theta=line[1];
CvPoint pt1,pt2;
double a=cos(theta); double b=sin(theta);
double x1=a*roi,y1=b*roi;
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(dst_color_image,pt1,pt2,CV_RGB(255,0,0),3,CV_AA,0);
}
#else
{
lines = cvHoughLines2(dst_gray_image,
storage,
CV_HOUGH_PROBABILISTIC,
1,
CV_PI/180,
50,
50,
10);
for (int i=0;i<lines->total;i++)
{
CvPoint *line=(CvPoint*)cvGetSeqElem(lines,i);
cvLine(dst_color_image,
line[0],line[1],
CV_RGB(255,0,0),
1,
8,
0);
}
}
#endif
cvNamedWindow("Show_Dst");
cvShowImage("Show_Dst",dst_color_image);
cvWaitKey();
//释放资源
cvReleaseImage(&src_image);
cvReleaseImage(&dst_gray_image);
cvReleaseImage(&dst_color_image);
cvDestroyWindow("Show_Src");
cvDestroyWindow("Show_Dst");
}