版主: chai2010, ollydbg23, bebekifis
void cvMatchHist( const CvArr* src, CvArr* dst, CvHistogram * histdst )
{
CvHistogram* hist = 0;
CvMat* lut = 0, *lutG = 0, *lutZ = 0;
CvHistogram * histeq = NULL;
CV_FUNCNAME( "cvMatchHist" );
__BEGIN__;
cvCopyHist( histdst, &histeq );
cvNormalizeHist(histeq, 1.0);
int i, hist_sz = 256;
CvSize img_sz;
float scale;
float* h, *hG;
int sum = 0;
int type;
CV_CALL( type = cvGetElemType( src ));
if( type != CV_8UC1 )
CV_ERROR( CV_StsUnsupportedFormat, "Only 8uC1 images are supported" );
CV_CALL( hist = cvCreateHist( 1, &hist_sz, CV_HIST_ARRAY ));
CV_CALL( lut = cvCreateMat( 1, 256, CV_8UC1 ));
CV_CALL( lutG = cvCreateMat( 1, hist_sz, CV_8UC1 ));
CV_CALL( lutZ = cvCreateMat( 1, hist_sz, CV_8UC1 ));
CV_CALL( cvCalcArrHist( (CvArr**)&src, hist ));
CV_CALL( img_sz = cvGetSize( src ));
scale = 255.f/(img_sz.width*img_sz.height);
h = (float*)cvPtr1D( hist->bins, 0 );
hG = (float*)cvPtr1D( histeq->bins, 0 );
for(i = 0; i < 256; i++)
{
sum += cvRound(hG[i]*255);
lutG->data.ptr[i] = (uchar)cvRound(sum);
}
sum = 0;
for( i = 0; i < hist_sz; i++ )
{
sum += cvRound(h[i]);
lut->data.ptr[i] = (uchar)cvRound(sum*scale);
}
for (i = 0; i < 256; i++)
{
int k = 0;
while(lutG->data.ptr[k] < i)
{
k++;
}
lutZ->data.ptr[i] = k;
}
lut->data.ptr[0] = 0;
CV_CALL( cvLUT( src, dst, lut ));
CV_CALL( cvLUT( dst, dst, lutZ ));
__END__;
cvReleaseHist(&hist);
cvReleaseMat(&lut);
cvReleaseMat(&lutG);
cvReleaseMat(&lutZ);
cvReleaseHist(&histeq);
} if( weak )
{
prune( CV_WHOLE_SEQ );
cvReleaseMemStorage( &weak->storage );
}
if( data )
delete data;
weak = 0;
data = 0;
cvReleaseMat( &orig_response );
cvReleaseMat( &sum_response );
cvReleaseMat( &weak_eval );
cvReleaseMat( &subsample_mask );
cvReleaseMat( &weights );
cvReleaseMat(&subtree_weights);
have_subsample = false;不过我没有注意存记录,弄的现在都不知道什么地方改过。
ollydbg23 写道:赞牛人!
……
这么好的帖子,建议你放入wiki里面!!!
feixiaolin 写道:ollydbg23 写道:赞牛人!
……
这么好的帖子,建议你放入wiki里面!!!
这正是我所期待的。
建议ollydbg23先做置顶处理。
bebekifis 写道:首先先推荐几篇供大家学习Opencv的文章吧,这些文章是一些经典的算法,它们在Opencv上已经有了具体的实践。这些算法原理比较简单,可以用来作为学习Opencv的算法(通过算法学代码)。这里所说的读代码是要深入函数的内部,了解代码运行的步骤,而不仅仅是会用个别函数:
1,Adaptive background mixture models for real-time tracking ---> 对应Opencv代码:CvGaussBGModel等。
2,Computer vision face tracking as a component of a perceptual user interface ---> cvCamShift等。
3,EM cluster --->CvEM 这个算法很简单,网上到处都有算法介绍。
4,计算机视觉那本书 ---> cvFindHomography, 根据多对点计算图像的投影变换矩阵。计算机标定和三维重建经常用到。
5,An Introduction To the Kalman Filter ---> CvKalman等
6,SIFT ---> Opencv算法版置顶里Rob Hess的SIFT代码,很值得一看,个人感觉非常好的SIFT代码。
先写这么多,把这些算法的Opencv实现完全看懂了Opencv大体上就没问题了。
ollydbg23 写道:feixiaolin 写道:ollydbg23 写道:赞牛人!
……
这么好的帖子,建议你放入wiki里面!!!
这正是我所期待的。
建议ollydbg23先做置顶处理。
我没有置顶权限,呵呵。估计只有yu版大才有。
Shiqi Yu 写道:ollydbg23 写道:我没有置顶权限,呵呵。估计只有yu版大才有。
我一直以为你有这个权限的
ollydbg23 写道:我帮忙找找吧,呵呵,不过最近海底电缆断了,连国外的要命了。。。
心飞翔 写道:看了下作者主页上的做图像匹配的视频链接,精度不感说,速度确实特别的快,不知道作者用的是啥方法?
SIFT、SURF吗?我觉得都做不了作者这么快!
正在浏览此版面的用户:Google [Bot], lq0104, MSN [Bot], ollydbg23 和 5 位游客