我试图在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很好,链接到库很好。我只需要知道如何将图像传递给此函数。此函数中的image参数的类型为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
。如果有人有示例代码或示例代码来进行此细分。
谢谢!
答案 0 :(得分: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);
答案 1 :(得分: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()