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
目录
相关文章
|
4月前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
264 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
1月前
|
算法 Serverless
基于魏格纳函数和焦散线方法的自加速光束matlab模拟与仿真
本项目基于魏格纳函数和焦散线方法,使用MATLAB 2022A模拟自加速光束。通过魏格纳函数法生成多种自加速光束,并设计相应方法,展示仿真结果。核心程序包括相位和幅度的计算、光场分布及拟合分析,实现对光束传播特性的精确控制。应用领域涵盖光学成像、光操控和光束聚焦等。 关键步骤: 1. 利用魏格纳函数计算光场分布。 2. 模拟并展示自加速光束的相位和幅度图像。 3. 通过拟合分析,验证光束加速特性。 该算法原理基于魏格纳函数描述光场分布,结合数值模拟技术,实现对光束形状和传播特性的精确控制。通过调整光束相位分布,可改变其传播特性,如聚焦或加速。
|
4月前
|
算法 计算机视觉
Opencv学习笔记(六):cv2.resize函数的介绍
这篇文章介绍了OpenCV库中cv2.resize函数的使用方法,包括其参数、插值方式选择以及实际代码示例。
782 1
Opencv学习笔记(六):cv2.resize函数的介绍
|
5天前
|
算法
基于GA遗传优化的PID控制器最优控制参数整定matlab仿真
通过遗传算法优化PID控制器的参数,可以有效提高控制系统的性能。本文详细介绍了GA优化PID参数的原理、适应度函数的设计以及MATLAB实现步骤,并通过仿真验证了优化效果。希望本文能为读者在实际应用中提供参考和帮助。
38 18
|
6天前
|
监控 算法 数据安全/隐私保护
基于扩频解扩+turbo译码的16QAM图传通信系统matlab误码率仿真,扩频参数可设置
本项目基于MATLAB 2022a实现图像传输通信系统的仿真,涵盖16QAM调制解调、扩频技术和Turbo译码。系统适用于无人机图像传输等高要求场景,通过扩频解扩和Turbo译码提升抗干扰能力。核心程序包括图像源处理、16QAM调制、扩频编码、信道传输、解扩及Turbo译码,最终还原并显示RGB图像。仿真结果无水印,操作步骤配有视频指导。
29 5
|
10天前
|
监控 算法 数据安全/隐私保护
基于扩频解扩+turbo译码的QPSK图传通信系统matlab误码率仿真,扩频参数可设置
本项目基于MATLAB 2022a实现图像传输通信系统的仿真,涵盖QPSK调制解调、扩频技术和Turbo译码。系统适用于无人机图像传输等高要求场景,确保图像质量和传输稳定性。通过仿真,验证了系统在不同信噪比下的性能,展示了图像的接收与恢复效果。核心代码实现了二进制数据到RGB图像的转换与显示,并保存不同条件下的结果。
30 6
|
4月前
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
248 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
2月前
|
资源调度 监控 算法
基于扩频解扩+LDPC编译码的QPSK图传通信系统matlab误码率仿真,扩频参数可设置
该通信系统主要用于高质量图像传输,如无人机、视频监控等场景。系统采用QPSK调制解调、扩频技术和LDPC译码,确保复杂电磁环境下的稳定性和清晰度。MATLAB仿真(2022a)验证了算法效果,核心程序包括信道编码、调制、扩频及解调等步骤,通过AWGN信道测试不同SNR下的性能表现。
79 6
基于扩频解扩+LDPC编译码的QPSK图传通信系统matlab误码率仿真,扩频参数可设置
|
1月前
|
监控 算法 数据安全/隐私保护
基于扩频解扩+LDPC编译码的16QAM图传通信系统matlab误码率仿真,扩频参数可设置
该通信系统主要用于高质量图像传输,适用于无人机、视频监控等场景。系统采用16QAM调制解调、扩频技术和LDPC译码,确保复杂电磁环境下的稳定性和清晰度。MATLAB 2022a仿真结果显示图像传输效果良好,附带的操作视频详细介绍了仿真步骤。核心代码实现了图像的二进制转换、矩阵重组及RGB合并,确保图像正确显示并保存为.mat文件。
55 20
|
2月前
|
监控 算法 数据安全/隐私保护
基于扩频解扩+turbo译码的64QAM图传通信系统matlab误码率仿真,扩频参数可设置
该通信系统基于MATLAB 2022a仿真,适用于高要求的图像传输场景(如无人机、视频监控等),采用64QAM调制解调、扩频技术和Turbo译码提高抗干扰能力。发射端包括图像源、64QAM调制器、扩频器等;接收端则有解扩器、64QAM解调器和Turbo译码器等。核心程序实现图像传输的编码、调制、信道传输及解码,确保图像质量和传输可靠性。
67 16

热门文章

最新文章