Я пытаюсь сегментировать изображение с помощью 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
правильно. Пожалуйста, если у кого-то есть пример или пример кода для этой сегментации.
Спасибо !!
Вам нужно выделить память для 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()
не передавайте все изображение, только пиксели! и, пожалуйста, используйте 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);