문제

Im trying to segment an image using SLIC in OpenCV. Im trying to use the following function:

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 
)

the #include is fine and the linking to libraries is fine. I just need to know how can I pass the image to this function. the image parameter in this function is of type float const * and I dont know how to convert the image to this type.

Here is how i am loading the image into the code:

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

and here is the whole code:

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);
}

and also i dont know if i am using the vl_uint32 * seg correctly. Please if someone has an example or sample code to do this segmentation.

Thanks !!

도움이 되었습니까?

해결책

You need to allocate storage for seg correctly. If you are going to use the C++ API as in berak's answer, (which I also recommend) you could create a Mat to hold the label data to make later access easier and automatically manage memory:

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);

If for some reason you don't want to do that, you would allocate a chunk of raw memory like this (not recommended):

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

Or if you decide to continue with the C API, you would use malloc (really not recommended):

vl_uint32* seg = (vl_uint32*)malloc(img->height * img->width); // don't forget to free()

다른 팁

don't pass the whole image, only the pixels ! and please use the c++ api, not the old c one.

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top