SLIC超像素分割slicmex源代码在windows下matlab中mex出错的修正

Posted 无鞋童鞋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SLIC超像素分割slicmex源代码在windows下matlab中mex出错的修正相关的知识,希望对你有一定的参考价值。

1. 说明

  关于超像素分割的背景不再过多说明,大致作用就是将区域内相似属性的像素集合到一起,合成一个有更多属性的块区域。其中SLIC算法应用最广泛,现在在图像处理和计算机领域有很广泛的应用。作用如图所示:



2. 下载地址和使用说明

  SLIC算法C++/Matlab的demo可以下面链接中下载:
  http://ivrl.epfl.ch/research/superpixels
  至于matlab下使用说明也不在过多描述,直接摘自原程序中说明:

%Input parameters are:
%[1] 8 bit images (color or grayscale)
%[2] Number of required superpixels (optional, default is 200)
%[3] Compactness factor (optional, default is 10)
%
%Ouputs are:
%[1] labels (in raster scan order)
%[2] number of labels in the image (same as the number of returned
%superpixels
%
%NOTES:
%[1] number of returned superpixels may be different from the input
%number of superpixels.
%[2] you must compile the C file using mex slicmex.c before using the code
%below
%======================================================================
%img = imread('someimage.jpg');
img = imread('bee.jpg');
[labels, numlabels] = slicmex(img,200,20);%numlabels is the same as number of superpixels
imshow(labels);

3.Matlab程序的Bug修改

  但是源程序slicmex.c在windows系统下编译是有错误的,主要提示如下:

  slicmex.c(387) : error C2275: “mwSize”:将此类型用作表达式非法.

  这是一个很典型的纯c程序的错误,尤其在移植c++代码到c的时候,经常会出现一个奇怪的错误,error C2275: “XXX”: 将此类型用作表达式非法。
  表达式非法,这个错误是由于c的编译器要求将变量的申明放在一个函数块的头部,而c++没有这样的要求造成的。
  修改如下:
  将源代码中387行的 mwSize定义的类型变量放到该函数的开头,和函数中其他变量定义在一起。如图所示:




  修改成:


  如果还不知道怎么修改的话,请点击下面的连接下载修改过的slicmex.c文件:
  https://github.com/DUTFangXiang/SLIC__superpixelSegmentation  
  同样,另外一个slicomex.c也是同样的一个问题,主要是变量没有定义在mexFunction函数的开头,它将判断输入是否正确写在了最前面,问题都集中在391行后面30行内,你可以自己将定义变量的地方移到函数的开头中,像文章中一样。
  下载完成直接 mex slicmex.c即可,至于怎么配置mex环境我就不再过多叙述了,因为那又是一个漫长的话题。


  个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

  转载请注明出处:http://blog.csdn.net/fx677588/article/details/53694406#comments


以上是关于SLIC超像素分割slicmex源代码在windows下matlab中mex出错的修正的主要内容,如果未能解决你的问题,请参考以下文章

SLIC超像素分割详解(一):简介

youcans 的 OpenCV 例程200篇171.SLIC 超像素区域分割

youcans 的 OpenCV 例程200篇172.SLIC 超像素区域分割算法比较

超像素分割的涵义

如何获取超像素分割后的每个小块

最简单的SLIC算法实现