error: (-215) (winSize.width - blockSize.width) % blockStride.width == 0 && (winSize.height - blockS

又出问题了。。应该是hog滑动窗口descriptors block的大小问题
先附上2个宝贵经验贴:
http://blog.csdn.net/qq_39451109/article/details/77327213
http://blog.sciencenet.cn/blog-605185-487959.html
这里写图片描述

通过调用函数hog.setSVMDetector(detector);来加载训练好的分类器数据时,千万要注意detector的维数必须是3780,否则运行到这个语句就会报错。detector的维数即为HOG特征的维数,由样本的宽高,窗口(win)、块(block)、单元(cell)以及单元的滑移步长决定,它的维数对检测的正确有很大影响。

我的代码:
//第二个参数,即矩阵的列是由下面的descriptors的大小决定的,可以由descriptors.size()得到,且对于不同大小的输入训练图片,这个值是不同的

data_mat = Mat::zeros(nImgNum, 3780, CV_32FC1);

//类型矩阵,存储每个样本的类型标志
Mat res_mat(nImgNum, 1, CV_32SC1);

HOGDescriptor *hog = new HOGDescriptor(cvSize(ImgWidht, ImgHeight), cvSize(16, 16), cvSize(8, 8), cvSize(8, 8), 9);

size_t HOGDescriptor::getDescriptorSize() const
{
CV_Assert(blockSize.width % cellSize.width == 0 &&
blockSize.height % cellSize.height == 0);
CV_Assert((winSize.width - blockSize.width) % blockStride.width == 0 &&
(winSize.height - blockSize.height) % blockStride.height == 0 );
return (size_t)nbins*
(blockSize.width/cellSize.width)*
(blockSize.height/cellSize.height)*
((winSize.width - blockSize.width)/blockStride.width + 1)*
((winSize.height - blockSize.height)/blockStride.height + 1);
}

你可能感兴趣的:(opencv)