找回密码
 注册
关于网站域名变更的通知
查看: 389|回复: 1
打印 上一主题 下一主题

MATLAB2015编译MeanShift实例

[复制链接]
  • TA的每日心情

    2019-11-20 15:22
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2021-1-29 18:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    MeanShift分割源码包,可以从这里下载,也可以从本人网盘(含MATLAB接口,和编译好的mexw32,mexw64,mexa64)下载。
    $ v1 m6 F" g) Z: X
    " S4 m/ I7 E) F' r4 X) p9 h. m4 Z原本代码中没有适用于Windows64和MATLAB64位的mexw64文件,需要自己编译生成,方法很简单,运行文件夹中的compile_edison_wrapper.m文件即可。
    : S9 g4 U  f" a& N9 D+ S5 O' u  T/ O3 g
    然后,读入一幅图像,调用edison_wrapper程序实现分割,注意要使edison_wrapper文件夹处于当前路径。如读入一幅Lena RGB图像,分割结果如下:
    . K# n2 l4 o. ]' ]5 U4 S, E/ ~
    + M0 G% [9 `4 Q# f! W! R+ UI=imread('D:\DataSets\oi\nsi\classical\LenaRGB.bmp');
    ! L3 H0 v& M# s0 w( t/ T; B[fimage, labels] = edison_wrapper(I, @RGB2Luv);
    & @9 A9 ~. ^3 [: ?+ Efigure3 x/ L1 N  z$ c: t% q  R
    subplot(121)
    $ X) k; J: U* Nimshow(I)% ~- i; T2 l: y- [6 {: y
    title('Orignal RGB image')
    ! o; B7 U0 {* q3 p+ hsubplot(122)
      F0 B$ c$ r5 |! Q9 Mimagesc(labels)  s$ x% I7 |' Y) D  r8 S; \" j
    axis image % 坐标轴与图像尺寸一致7 |, f. `( o# b' b2 h! r
    title('Segmentation result:labels')) Y" P" E; r2 T$ o9 ~& v

    / x1 {5 F4 j% I  f 8 e) r& b+ g9 k2 n- n$ |
    Problem&Solution, \' o- z& O& S. O5 `
    找不到编译器或SDK9 h) O% G" r. z9 Z0 P( m' u0 z
    Problem2 w! j6 B7 g* m+ M/ }
    提示:“未找到支持的编译器或 SDK”,如下图: 3 i; ?; G7 o2 i. T
    & f- T* W3 A; J
    3 y4 s# I- l2 v$ S1 O9 W

    5 |* A  Q8 D5 A* F- f2 k- k/ f/ H
    $ k2 i+ X4 F9 y% F2 Q% M
    8 \+ z: v4 w' [; z7 [Solution
    2 t/ Z/ {2 ]. o, W根据Matlab的提示,安装:Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO),在下载页面,有三个ISO文件可以选择,如下表选择第三个,即amd64。
    - }" s- x( r/ v+ D- L5 g3 @" |/ }7 S+ }7 w8 ~$ \2 K
    名称版本6 T- H5 V# h9 _+ A' I4 B  y* f
    GRMSDK_EN_DVD.isox86
    5 b! M  u# y. CGRMSDKIAI_EN_DVD.isoItanium
    9 m; z% l% V$ r& B2 Q4 M( UGRMSDKX_EN_DVD.isoamd64
    & G( q0 {: m: V( K1 k% i1 ^" f  H# v9 ]) M& F, K7 U

    8 t8 [! j6 c+ E6 J8 g, ]3 v注意' S: E+ K0 h8 W  Y
    6 @  S& l6 [) a8 j" A
    如果安装Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)时出现如下错误:" `' `' d2 Z- q

    . [* p. R% ^, v0 e
    • A problem occurred while installing selected Windows SDK components.* x) [1 P! L/ n. ?% @
    7 Q/ c% H1 m. F$ q+ h% B. j" _/ I5 H$ a: a
    • Installation of the “Microsoft Windows SDK for Windows 7” product has reported the following error: Please refer to Samples\Setup\HTML\ConfigDetails.htm document for further information.5 f9 H5 Z- v. a% q
    , s& @8 B  L& ~- M" F% _& O7 y
    • Please attempt to resolve the problem and then start Windows SDK setup again. If you continue to have problems with this issue, please visit the SDK team support page at http://go.microsoft.com/fwlink/?LinkId=130245.4 d7 [% G* A5 S* {8 j
    $ z1 U5 c& f+ C0 |! S
    • Click the View Log button to review the installation log.
    • To exit, click Finish.0 u" c# E: u- ?1 h( ]

    . r1 t8 `# ]; d4 D) z% K8 q+ Q! i/ F/ X
    如下图: % C) b: \, p+ }( R
    ; D3 E. _+ n0 |) K$ Q$ k

    2 x, F% v7 M6 `. ~; s- F
    , R7 l( g' _$ w) B. Q9 h- M0 F. g, e
    7 N# O) k7 A- k  g
    # X2 k7 x5 \& R$ p4 T# A
    解决办法:
    ) z! K  O$ ~8 b4 K: C5 B0 @
    3 ?) k+ Y5 Q0 ]: ]2 |! R出现此问题,很可能是你的PC机已经安装了:Microsoft Visual C++ 2010,而在安装Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)时默认选择安装Microsoft Visual C++ 2010,如下图,造成的冲突,可以卸载已经安装的,注意32和64位的都要卸载。
    * b" F. i* r( S# v, g" h. L: i5 z% X2 k9 E# F1 k6 I

    + ~1 }+ C/ ^- b0 g. ?: ^- v- }6 b& A; ]1 s: y" X

    4 }6 u! _8 \# ]; M3 b- V卸载完成后从新安装即可!!!
    , Z( l* c& l/ z* X9 [0 X" A' Q; v8 b; X5 T
    error C2143: syntax error1 G3 g! d5 m0 H* s- Z& a

    . M, V$ i8 F% f# fProblem$ e- F! G; i: j& U3 E/ ~" |/ r
    6 Y; q# F6 ~) G7 B, C/ J
    提示错误:error C2143: syntax error : missing ‘;’ before ‘type’,如下图所示: . s* i, P2 P9 s% e: d9 g
    : x8 l9 ]8 c- |

    % y/ A! D* ^' n/ q" k! w" ~. m8 S1 F, b) \, I/ h

    8 C8 |, `8 U' `$ T  |0 O7 |5 kSolution
    : N* ]3 @/ T4 ^
    1 w3 P* W: t# D3 j  ?
    ; S* |" i* X' S  k2 _$ R7 Z出现这种现象,很可能是你在用VC的编译器编译GNU的C语言写的代码,两个编译器中的C标准不一样。- N9 }* s+ n1 A0 r
    2 H! p4 x; d) Y1 J+ @' @0 Z( O
    一种方法是将文件后缀名.c,改成.cpp,重新编译,但可能还会有其它的错误。4 D4 P2 ^3 E; v4 D  V6 \
    ' }1 `8 Z& r1 H: @8 l- d1 G
    如果源文件是GNU的C代码,建议安装相应的编译器,然后编译,可参考TDM-GCC(gcc/g++)3 p& a/ K5 p  J( E' |
    & v* B! V6 s7 C' q; u
    $ n  \9 s* H0 Z% \
    一些有用的总结
      d* x+ h0 F5 w( |2 o4 a7 i9 u& M4 I7 G+ `# K
    注意系统平台和文件路径6 b4 r. ]. M- b; Y0 F+ k2 w6 ^
    " O" N5 O" U1 Y
    MATLAB 匹配查找文件的方式是这样的:
    0 I8 ^- J. H/ p6 E) y( J6 |8 y  r( M# G$ F
    先从当前目录寻找,假如没有,再到搜索路径中从顶层寻找,如果在同一目录下找到了函数名相同的.m文件、.mex…文件,如果.mex…文件和平台匹配,则执行之,反之执行.m文件。' B; P- P8 q& W* X" a, m
    0 |* S  D% {; {4 N6 K! a

    : E& ?; j( G8 X5 I/ X8 i系统平台
    0 [3 g9 \4 o0 ]( M0 k/ L
    1 @" O; |5 x, i) a# g8 V假如你有这样一个工具包tools,文件结构如下,tools为当前目录: 3 m7 [9 R' k" H/ h- w

    " c, Y/ U: d: l5 _- @2 M2 n- _5 z, x 5 `/ ~$ e& c2 |2 ?8 j4 P9 q; s
    * J4 [( }1 n# s; @
      N+ E. ^5 ?% _8 ]+ K9 a
    其中,func.m函数为MATLAB版,同时又用C语言写了类似的函数,并mex混编生成了Linux平台下的:mexa32、mexa64;Windows平台下的:mexw32、mexw64以及MAC平台下的:mexmac文件,如上图。
    0 i; c# r% Y" Q5 q$ \2 U  D5 p4 r4 S; D0 _% s7 C
    • 假如你现在处于Windows系统,并且MATLAB版本为64位,那么,你只能成功调用func.m、func.mexw64两个文件,并且会优先选择func.mexw64,而“mexw32”和“mexa64”都是不能用的。
    • 假如你现在处于Windows系统,并且MATLAB版本为32位,那么,你只能成功调用func.m、func.mexw32两个文件,并且会优先选择func.mexw32,“mexw64”和“mexa32”都是不能用的。! c% M" B% i( C6 K
    / ?9 C% `8 q1 |* ~+ j' G
    6 W: l- }/ K  U+ M
    文件路径% \% o2 P( X: x8 m) `( T

    1 q2 o2 ^( d. u& v依然如上图tools目录结构示意所示,tools为当前目录,不同的是:' g" ?. v. H# q% G

    ) Y4 W, l2 U  y) H1 {9 i) q' J$ `
    • 你删除了func.mexw32和func.mexw64文件,你的运行环境是Windows下的MATLAB,那么你调用成功的是func.m文件,而不是“mex”文件夹中的func.mexw32或func.mexw64,因为MATLAB第一匹配到“func”函数的是func.m;
      3 M( C3 q- k! u7 ^1 f0 z
    7 i. t; q% Z/ K% }1 U
    5 w" U( @9 r+ @9 f; V7 U' Y
    运行效率对比( f* t1 h  k* s( c; ?* c

    6 S4 S, b# r0 G. o( E8 c/ E* \; L# T
    / k+ Z; k. g& s  X  @8 L实验说明:
    . J6 v: u5 }( x7 B
    + V# M8 C5 _3 F1 ^6 X/ V9 Q2 o9 n主要对比MATLAB与C的(mex函数)分别在32和64位MATLAB上的执行效率。, Q/ x' f1 w7 T) e2 J, q
    5 ]: o6 |3 t9 P0 \5 K4 f4 _# a
    实验环境:ThinkPad E430c + Windows 10 + MATLAB 2015a(32bit)/ MATLAB 2015b(64bit)。
    & X+ W" ]2 q/ N3 O
    - z0 }& H6 w4 N( v7 W7 {
    • 实验1:循环N次,N=2×108;9 U- b' C6 L- ]- d& q

    5 ^% G' y. ^# a- B  C
    $ w- q3 w, y1 m, X7 ^& R" ctest.m 源码:
    - `* |+ `3 J! K" `! W2 e8 g7 l" e0 D, e, Y- T$ G0 n, N6 J
    N = 2*10e8;# \0 P! i. O8 t: f+ p- @
    tic
    " j3 m, n/ a, h* P" Y/ |9 Rfunc(N)
    - m' A/ |# l% J2 ]/ u& R0 j& itoc
    , \5 M: E. N% ?2 S# O: }' M
    8 A# H5 d3 ]# M9 c3 E* Mtic+ y# K' g" ]* S; T! Q
    for i=0:N-17 s" i, Q+ q+ G% w1 J4 a
    end6 S; Q' M; u% h  M  K5 p( P' W4 }
    toc+ A8 r' T0 Y4 G( S5 @" j2 U# z; Y
    " o: l1 X7 E; V3 b) f7 ^( `3 @

    & Z* E/ H9 V8 M, k' u5 f3 H5 T  S混编C代码(func.c):
    % R* O( M8 l# F/ J
    / |' x) i1 X1 p9 D/ S; Y+ _- l#include "mex.h" // include head files
    4 y  H9 N6 q( f// function, n$ d9 e4 Q% @$ A/ w
    double loopN(double N)
    , v2 X* k6 m9 j/ X6 q{
    - J# z: L) m9 ?    int i = 0;# `5 p! z2 C( [8 N
        for(i = 0; i< N; i++);
    ; a& i+ ?, P% A; a8 z" o; G    return i;
    + z$ }6 E) c6 K) u2 {) y}# _7 Q# h. ?8 r4 E* i$ l1 _  N1 K
    // inteRFace; U2 t; K" s8 n: D; ~
    void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
    # ^. \. P! I- Y+ B# @8 O{1 t; ^! N! T. L
        double *z;  v% M$ B0 }* y) S& W/ c6 ~
        double N;6 ?! Q3 A% r/ `( i9 A% N1 K1 L
        plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);' I0 l, G0 G8 l! q4 {
        z = mxGetPr(plhs[0]);/ ~- ~  u: b  c3 ?8 N& z2 c) i
        N = *(mxGetPr(prhs[0]));3 V: d# n4 X9 m
        *z = loopN(N);
    0 G+ X% x' a3 o}
    4 z% Q) o) w  U+ ~8 K+ f0 F) H+ W+ {4 n4 u! [

    ; @2 {) Y. {! c& f& c
    • 实验2:提取图像特征,工具包 matlabPyrTools;
      3 t. Z$ [# [/ A. e
    * q& z  N8 n& S9 @  Z2 z3 p9 L7 g

    % ?) U% h  p& E, `& A0 l. z测试MATLAB代码:
    : {0 v- S' ^2 o1 d0 M, A
    6 T8 D5 {, m4 FN = 20;
    2 |/ T  i" D- e: o0 L' i. s3 OI=imread('D:\DataSets\oi\nsi\classical\BaboonRGB.bmp');' H/ t9 o8 @4 _% G
    time_using = cputime;
    & b) {6 }  ~' X$ P1 E# @, Q8 G( H1 lgrayimg = double(rgb2gray(uint8(I)));
    / {5 f# W! [) M8 r5 dfor i = 1:N
    8 q  ]* t# o& B' v4 q: F    [pyr,pind] = builDSPyr(grayimg,3,'sp3Filters');, z) y8 Z* B. B6 m" C% G( Q9 m
        pyramids = getSpyr(pyr,pind);
    : Y, b' o' e! ~& o% Eend
      i4 J& w+ `3 {' C8 [time_using = cputime - time_using;3 J! K% G4 O: S; X
    time_using = time_using/N;0 l4 _) p: Y4 V; r& p  Q
    disp(time_using)
    - ?& n$ \+ k  A1 ~& B0 V* t* ]
    + T' A5 {! b8 [
    6 M5 q" }; }# L! l
    • 实验3:MeanShift分割,工具包 edison_wrapper,含MATLAB interface。9 F7 r# ?# X1 t! @5 l
    ; k- r: U# C3 \
    测试MATLAB代码:% \3 s& J/ b- V9 G6 a2 M9 \& g( o
    ) X! o' q5 I& L0 l
    N = 20;
    8 X; S6 I/ J4 Q  \# \6 t  G+ H/ }I=imread('D:\DataSets\oi\nsi\classical\BaboonRGB.bmp');
    - S, Q! K) n' vtime_using = cputime;
    6 v5 y6 v4 M  u0 G5 Ofor i = 1:N9 ^: n6 p& Q  v9 y- U
        [fimage, labels] = edison_wrapper(I, @RGB2Luv);
    3 D! N5 C1 i- _8 A! q7 u) z9 `' v! w0 Lend
    6 m6 z% _' R! {4 ^( [) }time_using = cputime - time_using;2 r. F7 \( |: d- Q# O# h
    time_using = time_using/N;
      F! p4 o0 u" Udisp(time_using)
    % V1 K  B9 o) r. [' _
    , v& l8 e$ k; k7 H! e0 I3 S
    4 U* P9 ?! \% ^4 P
    • 实验4:MeanShift分割,工具包 edison_wrapper,含MATLAB interface,对用matlabPyrTools提取的金字塔特征进行分割。
      4 b8 \+ a2 |# X5 {4 y$ X* U
    . `8 B' C( D3 Y9 X2 ~
    测试MATLAB代码:6 B0 X. i% m, U' t# I( R" h8 v
    4 [7 T! H! p$ F# f9 o
    N = 20;
    " i3 H# I4 E% V+ kI=imread('D:\DataSets\oi\nsi\classical\BaboonRGB.bmp');
    $ F! w3 U0 o  W0 B* W' _time_using = cputime;
    " ~: _8 K2 @4 b- {for i = 1:N7 R2 C5 T& j( |6 C# Z6 l
        [fimage, labels] = edison_wrapper(I, @ExtractFeature,  'SpatialBandWidth', 7, 'RangeBandWidth', 12, 'MinimumRegionArea', 200);4 t3 e; Z3 C$ k# G
    end" d* B1 A. J$ F4 F) O
    time_using = cputime - time_using;
    9 ]: D4 N2 R4 @6 {; g% k& I  Y. ktime_using = time_using/N;
    6 c7 N9 {# F7 X* }+ Ldisp(time_using)" i$ o/ q# m! r9 h

    . u6 E" ~$ v% M0 l# G6 t+ i* a
    : J  O  M  u$ a! i9 e! m实验结果:" L4 u% ]7 N! c' f: b

    : g2 h( U) r5 o4 }, J, k单位:<script type="math/tex" id="MathJax-Element-507">s</script>。
    4 R, H0 o; B% W. l' d
    - ?4 J2 b+ @, Y, j  d实验序号MATLAB(32)MATLAB(64)C(MEX, 32)C(MEX, 64)
    8 X1 n+ m' I$ H, J4 U14.917.424.541.43: T# W' y8 S/ i& y, `6 x: N8 I
    2--0.99530.4453
    + h( p$ S' G9 M* h$ D' D3--4.104.98
    ( m, o0 X. h6 c8 X" O4--11.6417.638 c4 M% l% G6 _- b% g

    3 \! u- _8 m8 S) i( Y; T; e6 @( h! `  y/ m* ~+ x
    实验结果很不可思议!
    1 p* G% v" J' h) {" E2 N
    & a$ M  l1 W' H' I# I: J5 a
    • 实验1:64位MATLABfor循环竟然比32位的慢了好些,而mex的C则相反(正常表现),不过可以看出C语言要比MATLAB快;
    • 实验2:正常表现;
    • 实验3:有些反常;
    • 实验4:64位竟然慢了那么多!: a: `( m- v6 }- I3 u) A

    . `( _7 }) T4 K7 Z" K# v% i) H
    % ^0 ]: R( r' P2 d; A2 I对于实验4,观察返回值labels,即超像素的标签,发现32位和64位结果并不一致,但大致相同,图形显示如下: # i5 Z1 a1 K* D, F7 \4 f
    & ?# n$ C+ E$ Z& I
    % n6 S5 ]3 r3 @3 D
    $ o# z# V% x3 D1 Y+ W' X
    MATLAB 32位和64位下得到的labels的部分值: ; g1 F6 d% M, W+ }
    # p) D1 S! v' b  A6 i
    0 b& l& {0 D- t5 C

    该用户从未签到

    2#
    发表于 2021-1-29 18:22 | 只看该作者
    是的,原本代码中没有适用于Windows64和MATLAB64位的mexw64文件,需要自己编译生成,方法很简单,运行文件夹中的compile_edison_wrapper.m文件即可。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-19 13:23 , Processed in 0.078125 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表