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
目录
相关文章
|
2月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
165 1
|
2月前
|
计算机视觉 索引
OpenCv实时设置摄像头参数/获得摄像头参数值的方法论
这篇文章提供了一个OpenCV的实例教程,展示了如何使用`createTrackbar()`函数实时设置和获取摄像头参数值,如饱和度、Gamma和亮度,并通过回调函数在程序中连续修改这些参数。
|
2月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
2月前
|
存储 计算机视觉
OpenCV 中 CV_8UC1,CV_32FC3,CV_32S等参数的含义
OpenCV 中 CV_8UC1,CV_32FC3,CV_32S等参数的含义
52 3
|
2月前
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
43 1
|
2月前
|
计算机视觉
OpenCV滑动条(createTrackbar()函数)如何在多个维度进行同步调整?
这篇文章介绍了如何在OpenCV中使用`createTrackbar()`函数创建多个滑动条以同步调整图像的多个维度(如亮度和对比度),通过将不同滑动条的回调函数合并为一个,确保它们在同一图像基础上进行调整。
|
2月前
|
数据建模 Python
MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数(上)
MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数
32 7
|
2月前
|
前端开发 计算机视觉
Building wheel for opencv-python (pyproject.toml) ,安装命令增加 --verbose 参数
Building wheel for opencv-python (pyproject.toml) ,安装命令增加 --verbose 参数
117 2
|
2月前
|
算法 数据建模 Python
MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数(下)
MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数
44 3
|
2月前
|
机器人 计算机视觉
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
46 2
下一篇
无影云桌面