Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
利用OpenCV提取HoG特征_Opencv_Computer Vision_Feature Detection_Object Recognition_Feature Extraction - Fatal编程技术网

利用OpenCV提取HoG特征

利用OpenCV提取HoG特征,opencv,computer-vision,feature-detection,object-recognition,feature-extraction,Opencv,Computer Vision,Feature Detection,Object Recognition,Feature Extraction,我正在尝试使用OpenCV的HogAPI提取功能,但是我似乎找不到允许我这样做的API 我试图做的是使用HoG从我所有的数据集(一组正片和负片图像)中提取特征,然后训练我自己的SVM 我偷看了一下OpenCV下的HoG.cpp,但没用。所有代码都隐藏在复杂性和满足不同硬件(如英特尔IPP)需求的环境中 我的问题是: 是否有OpenCV中的API可用于提取所有这些特征/描述符以输入SVM?如果有,我如何使用它来训练我自己的SVM 如果没有,是否有任何现有的库可以完成同样的任务 到目前为止,我实际上

我正在尝试使用OpenCV的HogAPI提取功能,但是我似乎找不到允许我这样做的API

我试图做的是使用HoG从我所有的数据集(一组正片和负片图像)中提取特征,然后训练我自己的SVM

我偷看了一下OpenCV下的HoG.cpp,但没用。所有代码都隐藏在复杂性和满足不同硬件(如英特尔IPP)需求的环境中

我的问题是:

  • 是否有OpenCV中的API可用于提取所有这些特征/描述符以输入SVM?如果有,我如何使用它来训练我自己的SVM
  • 如果没有,是否有任何现有的库可以完成同样的任务
  • 到目前为止,我实际上正在移植一个现有的库(http://hogprocessing.altervista.org/从处理(java)到C++,但它仍然非常慢,检测至少需要16秒< /p> 有没有其他人成功地提取了HoG特征,你是如何处理的?你们有我可以使用的开源代码吗


    提前感谢

    您可以在opencv中使用hog类,如下所示

    HOGDescriptor hog;
    vector<float> ders;
    vector<Point> locs;
    
    grayImg
    计算的HOG特征存储在
    ders
    向量中,使其成为一个矩阵,稍后可用于训练

    Mat Hogfeat(ders.size(), 1, CV_32FC1);
    
    for(int i=0;i<ders.size();i++)
        Hogfeat.at<float>(i,0)=ders.at(i);
    

    希望它是有用的:)

    与上面的文章相比,我还编写了2 hog特性的程序。 我应用这种方法来检查ROI区域是否发生变化。 请参考这里的页面。
    这也是GPU版本

    cv::Mat temp;
    gpu::GpuMat gpu_img, descriptors;
    
    cv::gpu::HOGDescriptor gpu_hog(win_size, Size(16, 16), Size(8, 8), Size(8, 8), 9,
                                   cv::gpu::HOGDescriptor::DEFAULT_WIN_SIGMA, 0.2, gamma_corr,
                                   cv::gpu::HOGDescriptor::DEFAULT_NLEVELS);
    gpu_img.upload(img);
    gpu_hog.getDescriptors(gpu_img, win_stride, descriptors, cv::gpu::HOGDescriptor::DESCR_FORMAT_ROW_BY_ROW);
                descriptors.download(temp);
    

    OpenCV 3对用户使用GPU算法(即CUDA)的方式进行了一些更改,请参阅

    要将用户3398689的答案更新为OpenCV 3,请执行以下截取代码:

    #包括
    #包括
    [...]
    /*假设在名为'src'的cv::Mat变量中加载一个图像*/
    int img_宽度=320;
    int img_高度=240;
    int block_size=16;
    int bin_编号=9;
    cv::Ptr cuda_hog=cuda::hog::创建(尺寸(img_宽度、img_高度),
    大小(块大小,块大小),
    尺寸(块尺寸/2,块尺寸/2),
    尺寸(块尺寸/2,块尺寸/2),
    bin_编号);
    /*以下命令是可选的:默认值适用*/
    cuda_hog->setDescriptorFormat(cuda::hog::DESCR_FORMAT_COL_BY_COL);
    cuda_hog->setGammaCorrection(真);
    cuda_hog->setWinStride(尺寸(img_宽度、img_高度));
    cv::cuda::GpuMat图像;
    cv::cuda::GpuMat描述符;
    上传图像(src);
    /*可能不适用于您*/
    /*CUDA HOG可处理强度(1通道)或BGRA(4通道)图像*/
    /*下一个函数调用使用GPU将标准BGR图像转换为BGRA*/
    cv::cuda::GpuMat图像_alpha;
    cuda::cvtColor(图像,图像α,颜色BGR2BGRA,4);
    cuda_hog->compute(图像α,描述符);
    cv::Mat dst;
    图像α下载(dst);
    

    然后,您可以根据自己的喜好使用'dst'变量中的描述符,例如G453所建议的描述符。

    目前我无法测试它,因为XCode 4.4以某种方式破坏了大多数已安装的库。当我设法解决这个问题时,我会通知你,你可以使用简单的欧几里德距离作为匹配器……我编辑了答案,见上面的相同答案:)@Sistu谢谢,我最终可以提取特征,但我仍然需要输入我自己的支持向量机。我使用的是OpenCV 2.3.1,但在这个版本中我没有
    HOGDescriptor::compute()
    。您在回答这个问题时使用了哪个OpenCV版本?很抱歉,刚刚发现它也适用于OpenCV 2.3.1。我使用的是
    cv::gpu::HOGDescriptor
    而不是
    cv::HOGDescriptor
    。谢谢只有链接不能被接受为答案,请在您的答案中描述链接所需的部分。我认为此页面可以帮助您:
    hog.blockSize = 16;
    hog.cellSize = 4;
    hog.blockStride = 8;
    
    // This is for comparing the HOG features of two images without using any SVM 
    // (It is not an efficient way but useful when you want to compare only few or two images)
    // Simple distance
    // Consider you have two HOG feature vectors for two images Hogfeat1 and Hogfeat2 and those are same size.
    
    double distance = 0;
    for(int i = 0; i < Hogfeat.rows; i++)
        distance += abs(Hogfeat.at<float>(i, 0) - Hogfeat.at<float>(i, 0));
    
    if (distance < Threshold)
        cout<<"Two images are of same class"<<endl;
    else
        cout<<"Two images are of different class"<<endl;
    
    cv::Mat temp;
    gpu::GpuMat gpu_img, descriptors;
    
    cv::gpu::HOGDescriptor gpu_hog(win_size, Size(16, 16), Size(8, 8), Size(8, 8), 9,
                                   cv::gpu::HOGDescriptor::DEFAULT_WIN_SIGMA, 0.2, gamma_corr,
                                   cv::gpu::HOGDescriptor::DEFAULT_NLEVELS);
    gpu_img.upload(img);
    gpu_hog.getDescriptors(gpu_img, win_stride, descriptors, cv::gpu::HOGDescriptor::DESCR_FORMAT_ROW_BY_ROW);
                descriptors.download(temp);
    
    #include <opencv2/core/cuda.hpp>
    #include <opencv2/cudaimgproc.hpp>
    
    [...]
    
    /* Suppose you load an image in a cv::Mat variable called 'src' */
    
    int img_width  = 320;
    int img_height = 240;
    int block_size = 16;
    int bin_number = 9;
    
    cv::Ptr<cv::cuda::HOG> cuda_hog = cuda::HOG::create(Size(img_width, img_height),
                                                        Size(block_size, block_size),
                                                        Size(block_size/2, block_size/2),
                                                        Size(block_size/2, block_size/2),
                                                        bin_number);
    
    /* The following commands are optional: default values applies */
    cuda_hog->setDescriptorFormat(cuda::HOG::DESCR_FORMAT_COL_BY_COL);
    cuda_hog->setGammaCorrection(true);
    cuda_hog->setWinStride(Size(img_width_, img_height_));
    
    cv::cuda::GpuMat image;
    cv::cuda::GpuMat descriptor;
    
    image.upload(src);
    
    /* May not apply to you */
    /* CUDA HOG works with intensity (1 channel) or BGRA (4 channels) images */
    /* The next function call convert a standard BGR image to BGRA using the GPU */
    cv::cuda::GpuMat image_alpha;
    cuda::cvtColor(image, image_alpha, COLOR_BGR2BGRA, 4);
    
    cuda_hog->compute(image_alpha, descriptor);
    
    cv::Mat dst;
    image_alpha.download(dst);