opencv通过dll调用matlab函数,图片作为参数

简介: [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”。而在实际的代码编写过程中,很多时候想把已经写好的matlab函数融合进去,但是依然是将图片作为参数传递比较成为问题。
[blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数
       
          前文介绍了如何“ csharp通过dll调用opencv函数,图片作为参数 ”。而在实际的代码编写过程中,很多时候想把已经写好的matlab函数融合进去,但是依然是将图片作为参数传递比较成为问题。这里我经过一段时间的研究解决了这个问题(目前只解决了灰度图片下的图片传递问题)。这个问题包含几个难点,一个是mxmatrix的使用,一个是matlab和opencv对于图片的格式处理是不一样的。
         本次这个项目,是opencv通过调用matlab里面实现的Frangi函数,对图像进行Frangi滤波处理,并且最后在opencv中显示出来。
         首先是修改Frangi函数,也就是调整参数,用图片作为输入和输出,一定要保证修改后的程序是正确的
function [outIm]  = GOFrangi(I)
%读入图片
defaultoptions  =  struct( 'FrangiScaleRange', [ 1  15],  'FrangiScaleRatio'2'FrangiBetaOne'0. 5'FrangiBetaTwo'15'verbose', true, 'BlackWhite', true);
options =defaultoptions; 
 
% Process inputs
if( ~exist( 'options', 'var')), 
    options =defaultoptions; 
else
    tags  = fieldnames(defaultoptions);
     for i = 1 :length(tags)
          if( ~isfield(options,tags{i})),  options.(tags{i}) =defaultoptions.(tags{i}); end
    end
     if(length(tags) ~=length(fieldnames(options))), 
        warning( 'FrangiFilter2D:unknownoption', 'unknown options found');
    end
end
 
sigmas =options.FrangiScaleRange( 1) :options.FrangiScaleRatio :options.FrangiScaleRange( 2);
sigmas  = sort(sigmas,  'ascend');
 
beta   =  2 *options.FrangiBetaOne ^ 2;
c      =  2 *options.FrangiBetaTwo ^ 2;
 
% Make matrices to store all filterd images
ALLfiltered =zeros([size(I) length(sigmas)]);
ALLangles =zeros([size(I) length(sigmas)]);
 
% Frangi filter  for all sigmas
for i  =  1 :length(sigmas),
     % Show progress
     % if(options.verbose)
     %    disp([ 'Current Frangi Filter Sigma: ' num2str(sigmas(i)) ]);
     %end
    
     % Make  2D hessian
    [Dxx,Dxy,Dyy]  = Hessian2D(I,sigmas(i));
    
     % Correct  for scale
    Dxx  = (sigmas(i) ^ 2) *Dxx;
    Dxy  = (sigmas(i) ^ 2) *Dxy;
    Dyy  = (sigmas(i) ^ 2) *Dyy;
   
     % Calculate (abs sorted) eigenvalues and vectors
    [Lambda2,Lambda1,Ix,Iy] =eig2image(Dxx,Dxy,Dyy);
 
     % Compute the direction of the minor eigenvector
    angles  = atan2(Ix,Iy);
 
     % Compute some similarity measures
    Lambda1(Lambda1 == 0= eps;
    Rb  = (Lambda2. /Lambda1). ^ 2;
    S2  = Lambda1. ^ 2  + Lambda2. ^ 2;
   
     % Compute the output image
    Ifiltered  = exp( -Rb /beta) . *(ones(size(I)) -exp( -S2 /c));
    
     % see pp.  45
     if(options.BlackWhite)
        Ifiltered(Lambda1 < 0) = 0;
     else
        Ifiltered(Lambda1 > 0) = 0;
    end
     % store the results in  3D matrices
    ALLfiltered( :, :,i)  = Ifiltered;
    ALLangles( :, :,i)  = angles;
end
 
% Return  for every pixel the value of the scale(sigma) with the maximum 
% output pixel value
if length(sigmas)  >  1,
    [outIm,whatScale]  = max(ALLfiltered,[], 3);
    outIm  = reshape(outIm,size(I));
     if(nargout > 1)
        whatScale  = reshape(whatScale,size(I));
    end
     if(nargout > 2)
        Direction  = reshape(ALLangles(( 1 :numel(I)) '+(whatScale(:)-1)*numel(I)),size(I));
    end
else
    outIm = reshape(ALLfiltered,size(I));
    if(nargout>1)
            whatScale = ones(size(I));
    end
    if(nargout>2)
        Direction = reshape(ALLangles,size(I));
    end
end
 
  片对代码进行编译。要注意这里是 -W lib:GOFrangi 而不是 -W cpplib:GOFrange
 mcc -W lib:GOFrangi -T link:lib GOFrangi.m -C 
拷贝这四个文件放到opencv目录下
系统相关设置
还有
还有
 
int _tmain( int argc, _TCHAR * argv[])
{    
    Mat src  = imread( "vessel.jpg", 0);
    imshow( "src",src);
    src.convertTo(src,CV_32F);  //32f非常常见
     //初始化函数,如果初始失败,刚提示并返回 
     if( !GOFrangiInitialize()) {
        printf( "调用matlab失败!");
         return  0
    } 
     else { 
        printf( "调用matlab成功!");
        mxArray  * pv;  
        mxArray  * pout;  
         if ( !src.empty())  {  
            Mat dst(src.rows,src.cols,CV_32F);
            Mat dst2(src.rows,src.cols,CV_32FC1);
            src  = src.t();
            pv  = mxCreateNumericMatrix(src.cols,src.rows,mxSINGLE_CLASS, mxREAL);  
            memcpy(mxGetPr(pv), src.data, mxGetNumberOfElements(pv) * sizeof( float));  
            pout  = mxCreateNumericMatrix(dst.cols,dst.rows,mxSINGLE_CLASS, mxREAL);  
            mlfGOFrangi( 1, &pout,pv);
            memcpy(dst.data,mxGetPr(pout),mxGetNumberOfElements(pout) * sizeof( float));
            dst.convertTo(dst,CV_8UC1);
             //数据对齐,直接换算
             int icols  = dst.cols;
             int irows  = dst.rows;
             for( int i = 0;i <dst.rows;i ++){       
                 for( int j = 0;j <dst.cols;j ++){    
                     int isum  = icols *i +j;
                     int i2  = isum  % irows;
                     int j2  = isum  / irows;
                    dst2.at <uchar >(i2,j2)  = dst.at <uchar >(i,j);
                }
            }
            imwrite( "结果图片.jpg",dst2);
        } else  {  
            printf( "src 为空! \n");  
             return  0;   
        }  
    }    
    waitKey();
     return  0;
}
生成结果





目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
7月前
|
安全 算法框架/工具 Python
使用雅可比椭圆函数为Reissner平面有限应变梁提供封闭形式解(Matlab代码实现)
使用雅可比椭圆函数为Reissner平面有限应变梁提供封闭形式解(Matlab代码实现)
164 2
|
7月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
8月前
|
算法 机器人 定位技术
【VRPTW】基于matlab秃鹰算法BES求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)(Matlab代码实现)
【VRPTW】基于matlab秃鹰算法BES求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)(Matlab代码实现)
250 0
|
7月前
|
数据采集 算法 前端开发
MATLAB|基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]
MATLAB|基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]
296 2
|
7月前
|
机器学习/深度学习 算法
【概率Copula分类器】实现d维阿基米德Copula相关的函数、HACs相关的函数研究(Matlab代码实现)
【概率Copula分类器】实现d维阿基米德Copula相关的函数、HACs相关的函数研究(Matlab代码实现)
214 5
|
7月前
|
机器学习/深度学习 传感器 算法
【裂纹检测】检测和标记图片中的裂缝(Matlab代码实现)
【裂纹检测】检测和标记图片中的裂缝(Matlab代码实现)
328 5
|
7月前
|
机器学习/深度学习 算法 PyTorch
【变分高斯Copula推断】基于Bernstein多项式的非参数转换则在描述单变量边缘后验时提供了充分的灵活性(Matlab代码实现)
【变分高斯Copula推断】基于Bernstein多项式的非参数转换则在描述单变量边缘后验时提供了充分的灵活性(Matlab代码实现)
159 2
|
7月前
|
数据采集 新能源 调度
【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)
【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)
342 4
|
7月前
|
Serverless Python
【三变量联合分布函数copula】利用AIC BIC确定单变量最优拟合函数、利用AIC确定三变量联合最优copula函数、计算联合概率(Matlab代码实现)
【三变量联合分布函数copula】利用AIC BIC确定单变量最优拟合函数、利用AIC确定三变量联合最优copula函数、计算联合概率(Matlab代码实现)
474 4
|
7月前
|
存储 编解码 并行计算
【快速傅里叶变换FFT、窗函数法、希尔伯特-黄变换、小波变换】电力系统同步相量计算研究(Matlab代码实现)
【快速傅里叶变换FFT、窗函数法、希尔伯特-黄变换、小波变换】电力系统同步相量计算研究(Matlab代码实现)
253 6

热门文章

最新文章

下一篇
开通oss服务