opencv_traincascade CvCascadeClassifier::fillPassedSamples中的无限循环
所以我一直在玩opencv最新的LBP cascade训练器,我一直在运行无限循环。我相信原因可能是因为我的负片(背景)设置有限。然而,程序不应该运行在无限循环中。。。我设法确定了无限循环的位置,并对源代码进行了一些修改,不仅避免了无限循环,而且还改进了结果级联文件中的检测性能。但是,我仍然希望理解代码的人告诉我这是否是一个正确的修复方法,以及它工作的原因(或其他原因): 样品制备: 因此,我有一个正图像,并使用“createsamples”生成100个扭曲/旋转的正样本:opencv_traincascade CvCascadeClassifier::fillPassedSamples中的无限循环,opencv,computer-vision,haar-wavelet,Opencv,Computer Vision,Haar Wavelet,所以我一直在玩opencv最新的LBP cascade训练器,我一直在运行无限循环。我相信原因可能是因为我的负片(背景)设置有限。然而,程序不应该运行在无限循环中。。。我设法确定了无限循环的位置,并对源代码进行了一些修改,不仅避免了无限循环,而且还改进了结果级联文件中的检测性能。但是,我仍然希望理解代码的人告诉我这是否是一个正确的修复方法,以及它工作的原因(或其他原因): 样品制备: 因此,我有一个正图像,并使用“createsamples”生成100个扭曲/旋转的正样本: opencv_cre
opencv_createsamples -img positive1.png -num 100 -bg neg.txt -vec samples.vec -maxidev 50 -w 100 -h 62 -maxxangle 0 -maxyangle 0.6 -maxzangle 0.4 -show 1
“阴性”目录中只有5个阴性样本。然后我的训练指挥部:
opencv_traincascade -data cascade_result -vec samples.vec -bg neg.txt -numStages 10 -numPos 100 -numNeg 200 -featureType LBP -w 100 -h 62 -bt DAB -minHitRate 0.99 -maxFalseAlarmRate 0.2 -weightTrimRate 0.95 -maxDepth 1
请注意,即使在“neg.txt”中只有5个负片图像,我还是设置了-numeng 200。后来我发现numNeg不需要匹配负片图像的数量,因为程序会反复从负片图像中“裁剪”出图像片段,用于训练正片图像
在第4阶段,我遇到了无限循环,它位于(请参见“//!!!!!”):
int-CvCascadeClassifier::fillPassedSamples(int-first,int-count,bool-isPositive,int64&consumed)
{
int getcount=0;
Mat img(级联参数winSize,CV_8UC1);
coutjoe
你可能会遇到和我一样的问题
问题的原因是opencv_traincascade.exe无法正确获取图像宽度和高度,或者原始图像宽度和高度小于训练窗口大小
您可以将以下代码中箭头所指的两行添加到opencv/appa/traincascade/imagestorage.cpp以解决此问题
bool CvCascadeImageReader::NegReader::nextImg()
{
Point _offset = Point(0,0);
size_t count = imgFilenames.size();
for( size_t i = 0; i < count; i++ )
{
src = imread( imgFilenames[last++], 0 );
if(src.rows<winSize.height || src.cols < winSize.width) <-----------
continue; <-----------
if( src.empty() )
continue;
....
bool-cvcascade-imagereader::NegReader::nextImg()
{
点_偏移=点(0,0);
size\u t count=imgFilenames.size();
对于(大小i=0;ibool CvCascadeImageReader::NegReader::nextImg()
{
Point _offset = Point(0,0);
size_t count = imgFilenames.size();
for( size_t i = 0; i < count; i++ )
{
src = imread( imgFilenames[last++], 0 );
if(src.rows<winSize.height || src.cols < winSize.width) <-----------
continue; <-----------
if( src.empty() )
continue;
....