OpenCV:获取Hough累加器值?

OpenCV:获取Hough累加器值?,opencv,Opencv,是否可以从Hough变换中获得累加器值以及rho和theta 我这样问是因为我想区分“定义良好”(即,具有高累加器值)的行和定义不好的行 谢谢 好的,查看cvhough.cpp文件,结构CvLinePolar仅由rho和angle定义 这就是我们调用HoughLines后传递回来的所有内容。我正在修改C++文件,看看是否能投票。< /P> 更新10月26日:刚刚意识到这些不是真正的答案,更像是问题。显然不赞成。我找到了一些关于重新编译OpenCV的说明。我想我们必须进入代码,修改它并重新编译。

是否可以从Hough变换中获得累加器值以及
rho
theta

我这样问是因为我想区分“定义良好”(即,具有高累加器值)的行和定义不好的行


谢谢

好的,查看cvhough.cpp文件,结构CvLinePolar仅由rho和angle定义

这就是我们调用HoughLines后传递回来的所有内容。我正在修改C++文件,看看是否能投票。< /P> 更新10月26日:刚刚意识到这些不是真正的答案,更像是问题。显然不赞成。我找到了一些关于重新编译OpenCV的说明。我想我们必须进入代码,修改它并重新编译。

10月27日更新:我用新代码编译OpenCV的DLL失败了,所以我最终将要修改的特定部分复制粘贴到自己的文件中。 我喜欢添加新函数,以避免重载已定义的函数。 您需要复制以下4个主要内容: 1-一些随机定义

#定义hough\u cmp\u gt(l1,l2)(辅助[l1]>辅助[l2])
静态CV_实施_QSORT_EX(icvHoughSortDescent32s,int,hough_cmp_gt,const int*)
2-重新定义线参数的结构

typedef结构CvLinePolar2
{
浮动rho;
浮动角;
浮动投票;
}
CvLinePolar2;
3-已修改的主要功能

静态无效
ICV路线标准2(常数CvMat*img、浮点数rho、浮点数θ、,
整数阈值,CvSeq*行,整数行最大值)
{
cv::自动缓冲、累计、排序;
cv::AutoBuffer禁忌,禁忌;
const uchar*图像;
内台阶、宽度、高度;
努姆尔霍省努曼格尔国际酒店;
int-total=0;
浮昂;
int r,n;
int i,j;
浮动irho=1/rho;
双尺度;
CV_断言(CV_为材料(img)&CV_材料类型(img->TYPE)=CV_8UC1);
image=img->data.ptr;
步骤=img->step;
宽度=img->cols;
高度=img->行;
numangle=cvRound(CV_PI/θ);
numrho=cvRound((宽度+高度)*2+1)/rho);
_累计分配((numangle+2)*(numrho+2));
_排序分配(numangle*numrho);
_tabSin.allocate(numangle);
_tabCos.分配(numangle);
int*accum=\u accum,*sort\u buf=\u sort\u buf;
浮动*tabSin=\u tabSin,*tabCos=\u tabCos;
memset(累计,0,大小f(累计[0])*(numangle+2)*(numrho+2));
对于(ang=0,n=0;n阈值&&
accum[base]>accum[base-1]&accum[base]>=accum[base+1]&&
累加[base]>acum[base-numrho-2]&累加[base]>=acum[base+numrho+2])
sort_buf[total++]=base;
}
//阶段3.按累加器值对检测到的行进行排序
IcvhoughtDescent32s(分类、总计、累计);
//阶段4.将第一个min(总计,行数最大)行存储到输出缓冲区
linesMax=最小值(linesMax,总计);
比例=1./(numrho+2);
对于(i=0;i
4-调用该函数的函数

CV_IMPL CvSeq*
cvHoughLines3(CvArr*src_图像,void*lineStorage,int方法,
双ρ,双θ,整数阈值,
双参数1,双参数2)
{
CvSeq*结果=0;
CvMat存根,*img=(CvMat*)src_图像;
CvMat*mat=0;
CvSeq*行=0;
CvSeq行(U头);
CVSeq块线_块;
int线型,elemSize;
int linesMax=int_MAX;
int-iparam1,iparam2;
img=cvGetMat(img和存根);
如果(!CV_是_MASK_ARR(img))
CV_错误(CV_StsBadArg,“源图像必须为8位,单通道”);
if(!lineStorage)
CV_错误(CV_StsNullPtr,“空目的地”);
如果(ρcols!=1))
CV_错误(CV_StsBadArg,
“目标矩阵应该是连续的,并且只有一行或一列”);
如果(CV\u材料类型(材料->类型)!=线型)
CV_错误(CV_StsBadArg,
“目标矩阵数据类型不合适,请参阅手册”);
lines=cvMakeSeqHeaderForArray(线型、尺寸(CvSeq)、elemSize、mat->data.ptr、,
物料->行+物料->列-1,&行\表头,&行\块);
linesMax=行->总计;
cveq(行);
}
其他的
CV_错误(CV_StsBadArg,“目的地不是CvMemStorage*或CvMat*”;
iparam1=cvRound(参数1);
iparam2=cvRound(参数2);
开关(方法)
{
案例CV_HOUGH_标准:
ICV路线标准2(img,(浮动)rho,
(浮动)θ、阈值、直线、直线最大值);
打破
违约:
CV_错误(CV_StsBadArg,“无法识别的方法id”);
}
if(mat)
{