Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SLIC c++;分段_C++_Opencv_Vlfeat - Fatal编程技术网

C++ SLIC c++;分段

C++ SLIC c++;分段,c++,opencv,vlfeat,C++,Opencv,Vlfeat,我正在尝试使用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 minRegio

我正在尝试使用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 
)
“包含”很好,链接到库也很好。我只需要知道如何将图像传递给此函数。这个函数中的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);
}
extern“C”{
#包括
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main(){
IplImage*图像=cvLoadImage(“train.tif”,1);
vl_uint32*seg;
vl_slic_段(seg,(常量浮点*)图像,图像->宽度,图像->高度,图像->通道,15,0.1,1);
等待键(0);
}
而且我也不知道我是否正确使用了
vl_uint32*seg
。请如果有人有一个例子或样本代码来做这个分段


谢谢

不要传递整个图像,只传递像素!请使用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);

您需要为
seg
正确分配存储空间。如果您打算使用C++ API作为BARAK的答案,(我也建议),您可以创建一个<代码> Mat < /Cord>,以保存标签数据,使以后的访问更容易,并自动管理内存:

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);
或者,如果您决定继续使用C API,您将使用
malloc
(确实不推荐):


您还可以对第二个参数使用
floatimg.ptr()
,以消除这种讨厌的强制转换谢谢大家@berak@Aurelius..但它不起作用..我试着调试程序,但我遇到了一个分段错误:
0xb7ead9bb mov%edi,(%ecx)
顺便问一下,图像大小是1024*1024..我应该对变量
seg
做些什么吗?@triple13你看到我的答案了吗
seg
必须指向某个预先分配的内存块。@Aurelius是的,我刚看到它,正在尝试它…我会让你知道的。。非常感谢:)@Aurelius。。它似乎有效:)…但是有没有办法看到分割的照片???。我是指结果。。再次感谢:)@triple13是的,取决于你想要什么。您可以在
labels
图像上调用
imshow()
,查看生成的标签。任何其他问题都超出了这个问题的范围。另外,如果my或berak的答案有帮助,您会单击绿色复选标记接受它吗?这是一个表示“谢谢”并表明找到了解决方案的好方法。@Aurelius.是的,我已经这么做了,非常感谢:)图像看起来是黑色的,但我会找到一种正确显示它的方法。
vl_uint32* seg = new vl_uint32[floatimg.total()]; // don't forget to delete[]
vl_uint32* seg = (vl_uint32*)malloc(img->height * img->width); // don't forget to free()