opencv — SLIC c ++ сегментация

Я пытаюсь сегментировать изображение с помощью SLIC в OpenCV. Я пытаюсь использовать следующую функцию:

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 правильно. Пожалуйста, если у кого-то есть пример или пример кода для этой сегментации.

Спасибо !!

2

Решение

Вам нужно выделить память для seg правильно. Если вы собираетесь использовать 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()
3

Другие решения

не передавайте все изображение, только пиксели! и, пожалуйста, используйте API C ++, а не старый 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);
3

По вопросам рекламы [email protected]