代码:
#include <cv.h>
#include <iostream>
#include <highgui.h>
using namespace std;
int main()
{
char *path="F:\\vs2008test\\hough_test\\stuff.jpg";
IplImage * src_Img=NULL;
src_Img=cvLoadImage(path ,1);//-1 代表不变,1代表bgr
if(!src_Img)
return -1;
cvNamedWindow("E1",CV_WINDOW_AUTOSIZE);
cvShowImage("E1",src_Img);
cvWaitKey();
IplImage * edge_Img=NULL;
edge_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
IplImage *temp_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
cvCvtColor(src_Img,temp_Img,CV_BGR2GRAY);
cvShowImage("E1",temp_Img);
cvWaitKey();
cvCanny(temp_Img,edge_Img,50,100);
cvShowImage("E1",edge_Img);
cvWaitKey();
//hough变化直线检测
CvMemStorage *storage=cvCreateMemStorage(0);//内存采用默认大小
CvSeq * lines=0;
lines=cvHoughLines2(edge_Img,storage,CV_HOUGH_STANDARD,1,CV_PI/180,150);
for (int i=0;i<MIN(lines->total,100);i++)
{
float *line=(float *)cvGetSeqElem(lines,i);
float rho =line[0];
float theta=line[1];
cout<<"rho:"<<rho<<",theta:"<<theta<<endl;//注意坐标系采用图像坐标系,坐标原点在左上角
CvPoint pt1,pt2;
double a=cos(theta),b=sin(theta);
double x0=a*rho,y0=b*rho;
pt1.x=cvRound(x0 + 500*(-b));
pt1.y=cvRound(y0 + 500*(a));
pt2.x=cvRound(x0 - 500*(-b));
pt2.y=cvRound(y0 - 500*(a));
cvLine(src_Img,pt1,pt2,CV_RGB(255,0,0),1,CV_AA,0);
cout<<x0<<","<<y0<<endl;//如果点不在图像内,那么选在这条直线上离这个点最近的点开始画
}
//hough变化圆检测
cvClearMemStorage(storage);
CvSeq * cir=NULL;
cir=cvHoughCircles(temp_Img,storage,CV_HOUGH_GRADIENT,1,src_Img->width/10 ,80,40);
for (int i=0;i<MIN(cir->total,100);i++)
{
float * p=(float *)cvGetSeqElem(cir,i);
CvPoint pt=cvPoint(cvRound(p[0]),cvRound(p[1]));
cvCircle(src_Img,pt,cvRound(p[2]),CV_RGB(0,255,0));
cout<<"圆心:"<<pt.x<<","<<pt.y<<endl;
cout<<"半径:"<<p[2]<<endl;
}
cvShowImage("E1",src_Img);
cvWaitKey();
cvDestroyWindow("E1");
cvReleaseImage(&src_Img);
cvReleaseImage(&edge_Img);
cvReleaseImage(&temp_Img);
cvReleaseMemStorage(&storage);
实验结果:
说明:
1、opencv版本为2.1
2、所用图像,为opencv安装文件夹里自带图像
3、opencv 中 cvLoadImage(path ,1);读入的图像3个通道为BGR,而不是RBG
4、对比上述两幅图,cvhoughlines2检测结果和threshold(认定为一条直线式在累计平面中必须达到的值)取值关系密切
5、注意霍夫变化所用涉及到的x-y坐标就是图像坐标系,即图像原点在左上方
6、在上列程序中cvhoughlines2(),参数method为CV_HOUGH_STANDARD。在opencv官网上(http://www.opencv.org.cn/index.php/Hough%E7%BA%BF%E6%AE%B5%E6%A3%80%E6%B5%8B)的程序中method参数为CV_HOUGH_PROBABILISTIC。该方法为PPHT,这种算法是标准霍夫变化的一个变种,它的好处是可以计算线段的方向以及范围。
问题:
opencv中是怎么进行内存管理的,cvCreateMenStorage,cvReleaseMemStorage,cvClearMemStorage,cvMemStorageAlloc,三者关系?