Opencv 使用HOGDescriptor的断言失败

Opencv 使用HOGDescriptor的断言失败,opencv,histogram,Opencv,Histogram,好的,所以我决定使用一个有方向梯度的直方图是一个更好的图像指纹方法,而不是创建一个索贝尔导数的直方图。我想我终于大致解决了这个问题,但当我测试代码时,我得到了以下结果: OpenCV错误:断言失败((winSize.width-blockSize.width)%blockStride.width==0&&(winSize.height-blockSize.height)%blockStride.height==0) 到现在为止,我只是想弄清楚如何正确地计算HOG并看到结果;但不是视觉上的,我只是

好的,所以我决定使用一个有方向梯度的直方图是一个更好的图像指纹方法,而不是创建一个索贝尔导数的直方图。我想我终于大致解决了这个问题,但当我测试代码时,我得到了以下结果:

OpenCV错误:断言失败((winSize.width-blockSize.width)%blockStride.width==0&&(winSize.height-blockSize.height)%blockStride.height==0)

到现在为止,我只是想弄清楚如何正确地计算HOG并看到结果;但不是视觉上的,我只是想要一些非常基本的输出,看看猪是不是被创造出来的。然后我将找出如何在图像比较中使用它

这是我的示例代码:

using namespace cv;
using namespace std;

int main(int argc, const char * argv[])
{
//    Initialize string variables.
string thePath, img, hogSaveFile;
thePath = "/Users/Mikie/Documents/Xcode/images/";
img = thePath + "HDimage.jpg";
hogSaveFile = thePath + "HDimage.yml";
//    Create mats.
Mat src;
//    Load image as grayscale.
src = imread(img, CV_LOAD_IMAGE_GRAYSCALE);
//    Verify source loaded.
if(src.empty()){
    cout << "No image data. \n ";
    return -1;
}else{
    cout << "Image loaded. \n" << "Size: " << src.cols << " X " << src.rows << "." << "\n";

}

//    Initialize float variables.
float imgWidth, imgHeight, newWidth, newHeight;
imgWidth = src.cols;
imgHeight = src.rows;
newWidth = 320;
newHeight = (imgHeight/imgWidth)*newWidth;
Mat dst = Mat::zeros(newHeight, newWidth, CV_8UC3);
resize(src, dst, Size(newWidth, newHeight), CV_INTER_LINEAR);
//    Was resize successful?
if (dst.rows < src.rows && dst.cols < src.cols) {
    cout << "Resize successful. \n" << "New size: " << dst.cols << " X " << dst.rows << "." << "\n";
} else {
    cout << "Resize failed. \n";
    return -1;
}

vector<float>theHOG(Mat dst);{
    if (dst.empty()) {
        cout << "Image lost. \n";
    } else {
        cout << "Setting up HOG. \n";
    }
    imshow("Image", dst);
    bool gammaC = true;
    int nlevels = HOGDescriptor::DEFAULT_NLEVELS;
    Size winS(newWidth, newHeight);
//        int block_size = 16;
//        int block_stride= 8;
//        int cell_size = 8;
    int gbins = 9;
    vector<float> descriptorsValues;
    vector<Point> locations;
    HOGDescriptor hog(Size(320, 412), Size(16, 16), Size(8, 8), Size(8, 8), gbins, -1, HOGDescriptor::L2Hys, 0.2, gammaC, nlevels);
    hog.compute(dst, descriptorsValues, Size(0,0), Size(0,0), locations);
    printf("descriptorsValues.size() = %ld \n", descriptorsValues.size()); //prints 960
    for (int i = 0; i <descriptorsValues.size(); i++) {
        cout << descriptorsValues[i] << endl;
    }
}
cvWaitKey(0);
return 0;
}
使用名称空间cv;
使用名称空间std;
int main(int argc,const char*argv[]
{
//初始化字符串变量。
字符串路径、img、hogsave文件;
路径=“/Users/Mikie/Documents/Xcode/images/”;
img=路径+“HDimage.jpg”;
hogSaveFile=thePath+“HDimage.yml”;
//制作垫子。
Mat-src;
//将图像加载为灰度。
src=imread(img、CV\u LOAD\u IMAGE\u灰度);
//验证已加载源。
if(src.empty()){

不能您不正确地初始化了
HOGDescriptor
。 断言声明前三个输入参数中的每一个都必须满足约束:

(winSize - blockSize) % blockStride == 0
高度
宽度
尺寸中

问题在于,
winSize.height
不满足此约束,考虑到使用以下参数初始化
hog

(412 - 16) % 8 = 4    //Problem!!

可能最简单的修复方法是将窗口尺寸从
cv::Size(320412)
增加到可以被8整除的值,可能是
cv::Size(320416)
,但具体大小将取决于您的具体要求。请注意断言所说的内容!

您错误地初始化了
描述符。
断言声明前三个输入参数中的每一个都必须满足约束:

(winSize - blockSize) % blockStride == 0
高度
宽度
尺寸中

问题在于,
winSize.height
不满足此约束,考虑到使用以下参数初始化
hog

(412 - 16) % 8 = 4    //Problem!!

可能最简单的修复方法是将窗口尺寸从
cv::Size(320412)
增加到可以被8整除的值,可能是
cv::Size(320416)
,但具体大小将取决于您的具体要求。请注意断言所说的内容!

断言发生在哪一行?它说它发生在hog.cpp的第65行,但我发现上面的实际代码中没有提到哪一行,但我认为我在第68行定义了HOGDescriptor。查找第th行断言发生在上应该是您尝试的第一件事。当断言发生时,您能看到调用堆栈吗?好的,我使用的是xCode,它看起来对调用堆栈不友好,但我认为我现在已经正确设置了它。错误似乎发生在第77行或第78行。下面是77:
HOGDescriptor hog(大小(320412)、大小(16、16)、大小(8、8)、大小(8,8),gbins,-1,HOGDescriptor::L2Hys,0.2,gammaC,nlevels);
和78:
hog.compute(dst,描述符值,大小(0,0),大小(0,0),位置);
。这也是我发现的。:)你看到我的答案了吗?断言发生在哪一行?它说它发生在hog.cpp的第65行,但我发现上面的实际代码中没有提到哪一行,但我认为是第68行定义了HOGDescriptor。找到断言发生在哪一行应该是你首先要做的事情。当断言发生时,你能看到调用堆栈吗urs?好的,我正在使用xCode,它看起来不利于调用堆栈,但我想我现在已经正确设置了它。似乎错误发生在第77行或第78行。这里是77:
HOGDescriptor hog(大小(320412)、大小(16、16)、大小(8、8)、大小(8、8)、gbins,-1、HOGDescriptor::L2Hys、0.2、gammaC、nlevels);
和78:
hog.compute(dst,描述符值,大小(0,0),大小(0,0),位置);
。这也是我发现的。:)你看到我的答案了吗?我刚刚看到了,谢谢。我必须刷新页面。我会让你知道结果的。你是对的,先生。谢谢。我很感激。现在效果很好。我很高兴我能帮上忙!我刚刚看到了,谢谢。我必须刷新页面。我会让你知道结果。你是对的,先生。谢谢。我很感激。效果很好现在小心点。我很高兴能帮上忙!