使用Vlfeat的C API进行快速移动

时间:2014-02-19 01:21:34

标签: c++ opencv netbeans computer-vision vlfeat

我已经在我的电脑上安装了vlfeat,似乎已经开始使用netbeans了。

我目前正在尝试使用vlfeat的快速移动功能,但我无法找到有关如何执行以下操作的任何参考:

  1. 使用quickshift在vlfeat的C / C ++代码中导入输入图像 分割。
  2. 我需要初始化一个快速移动对象'vl_qs_type' 为此目的,我无法找到办法。
  3. 对此的任何帮助都将非常感激。

    感谢。

2 个答案:

答案 0 :(得分:1)

我也需要使用VLFeat的Quick Shift实现。以下片段说明了如何使用C ++实现。当我使用OpenCV读取图像时,首先将OpenCV与VLFeat头文件一起包括:

#include <opencv2/opencv.hpp>

extern "C" {
    #include "generic.h"
    #include "quickshift.h"
}

下载VLFeat后(在我的情况下,存档包含文件夹vlfeat-0.9.18),我使用CMake将vlfeat-0.9.18/vl添加为包含目录。否则你必须调整上面的代码。然后,以下代码读取图像,将图像转换为所需格式并运行“快速切换”。

注意:以下代码段只是我原始代码的摘录,因此未经过测试,如下所示。

// Read an image using OpenCV, I assume a color image to be given;
// the image will be loaded in BGR color space.
cv::Mat mat = cv::imread("Lenna.png", CV_LOAD_IMAGE_COLOR);

// Convert image to one-dimensional array.
double* image = new double[mat.rows*mat.cols*mat.channels()];
for (int i = 0; i < mat.rows; ++i) {
    for (int j = 0; j < mat.cols; ++j) {
        image[j + mat.cols*i + mat.cols*mat.rows*0] = mat.at<cv::Vec3b>(i, j)[0];
        image[j + mat.cols*i + mat.cols*mat.rows*1] = mat.at<cv::Vec3b>(i, j)[1];
        image[j + mat.cols*i + mat.cols*mat.rows*2] = mat.at<cv::Vec3b>(i, j)[2];
    }
}

// Create a new quickshift instance using the image, the height and width of the
// image as well as the number of channels.
VlQS* quickShift = vl_quickshift_new(image, mat.rows, mat.cols, mat.channels());
vl_quickshift_set_kernel_size(quickShift, 5);

// Run Quick Shift.
vl_quickshift_process(quickShift);

但是,我无法弄清楚如何解释和使用实现的输出。

答案 1 :(得分:0)

  1. 在本网站的{strong>使用部分Quick shift image segmentation中,会显示一个简单的管道。

  2. 正如vl_quickshift_new的API文档中所述:

    • imagevl_qs_type值的数组,具有三个维度(分别为widht,height和channels)。通常,颜色(例如RGB)图像具有三个通道。像素的线性索引使用以下公式计算:channels * width* height + row + height * col
    • vl_qs_type是双倍的,即typedef double vl_qs_type
    • image只是一个双数组。
  3. 我不确定你采用Vlfeat的目的,但我强烈推荐使用Vlfeat的Matlab包装器,因为有很多可用的教程,很多算法都是简单的单一matlab函数调用。