2

我试图在 OpenCV 中使用 SLIC 分割图像。我试图使用以下功能:

void vl_slic_segment    (   vl_uint32 *     segmentation,
float const *   image,
vl_size     width,
vl_size     height,
vl_size     numChannels,
vl_size     regionSize,
float   regularization,
vl_size     minRegionSize 
)

#include 很好,链接到库也很好。我只需要知道如何将图像传递给这个函数。此函数中的图像参数是类型float const *,我不知道如何将图像转换为这种类型。

这是我将图像加载到代码中的方式:

IplImage *image = cvLoadImage("train.tif", 1);

这是整个代码:

extern "C" {
  #include </home/me/Downloads/vlfeat-0.9.17/vl/slic.h>
}
#include <stdio.h>
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
#include<opencv/highgui.h>

using namespace std;
using namespace cv;

int main () {
    IplImage *image = cvLoadImage("train.tif", 1);

   vl_uint32 * seg;

   vl_slic_segment(seg,(const float *)image,image->width,image->height,image->nChannels,15,0.1,1);

  waitKey(0);
}

而且我不知道我是否使用vl_uint32 * seg正确。请如果有人有一个示例或示例代码来进行此分割。

谢谢 !!

4

2 回答 2

3

您需要seg正确分配存储空间。如果您要像 berak 的回答那样使用 C++ API,(我也建议这样做),您可以创建一个Mat来保存标签数据,以便以后访问更容易并自动管理内存:

cv::Mat labels(floatimg.size(), CV_32SC1); // Mat doesn't support 32-bit unsigned directly, but this should work fine just to hold data.
vl_slic_segment(labels.ptr<vl_uint32>(),floatimg.ptr<float>(),floatimg.cols,floatimg.rows,floatimg.channels(),15,0.1,1);

如果由于某种原因你不想这样做,你会像这样分配一块原始内存(不推荐):

vl_uint32* seg = new vl_uint32[floatimg.total()]; // don't forget to delete[]

或者如果你决定继续使用 C API,你会使用malloc真的不推荐):

vl_uint32* seg = (vl_uint32*)malloc(img->height * img->width); // don't forget to free()
于 2013-08-27T16:02:24.573 回答
3

不要传递整个图像,只传递像素!请使用 c++ api,而不是旧的 c。

Mat img = imread("train.tif", 1); // 0 for grayscale
Mat floatimg;
img.convertTo(CV_32FC3,floatimg); // CV_32FC1 for grayscale

vl_slic_segment(seg,(const float *)(floatimg.data),floatimg.cols,floatimg.rows,floatimg.channels(),15,0.1,1);
于 2013-08-27T15:39:08.263 回答