opencv霍夫变化检测直线和圆

代码:

#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,三者关系?


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值