2

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 は問題なく、ライブラリへのリンクも問題ありません。この関数に画像を渡す方法を知る必要があります。この関数の画像パラメーターは型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また、正しく使用しているかどうかもわかりません。誰かがこのセグメンテーションを行うための例またはサンプル コードを持っている場合はお願いします。

ありがとう !!

4

2 に答える 2

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()
于 2013-08-27T16:02:24.573 に答える