[blog 项目实战派]csharp通过dll调用opencv函数

[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;
}

生成结果

来自为知笔记(Wiz)

时间: 2024-08-06 07:43:04

[blog 项目实战派]csharp通过dll调用opencv函数的相关文章

[blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数

?一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找到了比较好的资料.一个是thinimage,一个是basework,里面都实现了这里的“csharp通过dll调用opencv函数,并且采用图片作为参数”.这里小结如下. 关于如何“csharp通过dll调用opencv函数”,请参考前面博文,这里主要说如何“采用图片为参数”. 在编写图像识别/增强/机器视觉等项目的时候,一般会将算法打包成dll文件给客户,如果界面是用mfc写的话,是很好实现这个

[blog 项目实战派]钢管识别项目2

钢管识别项目2 零.相关说明: 首先进行一下相关说明.在"jsxyhelu.cnblogs.com/项目实战派"栏目里面出现的需求.图片和其他资源,都是我在浏览威客网站.论坛等网站的时候通过正规渠道获得的真实需求.个人觉得比较感兴趣,但是由于时间或者工作的冲突自己没有去接这些项目.但是由于这些需求都很有实现价值,所以过了一段时间,仍然拿出来练一练手,并且实现了核心模块.希望能够给浏览者一些启发.如果你认为这些图片和资源放在这里不合适,请及时联系我([email protected]),

[blog 项目实战派]压板识别项目分析

压板识别项目 零.相关说明: 首先进行一下相关说明.在"jsxyhelu.cnblogs.com/项目实战派"栏目里面出现的需求.图片和其他资源,都是我在浏览威客网站.论坛等网站的时候通过正规渠道获得的真实需求.个人觉得比较感兴趣,但是由于时间或者工作的冲突自己没有去接这些项目.但是由于这些需求都很有实现价值,所以过了一段时间,仍然拿出来练一练手,并且实现了核心模块.希望能够给浏览者一些启发.如果你认为这些图片和资源放在这里不合适,请及时联系我([email protected]),我

[blog 项目实战派]钢管识别项目1

钢管识别项目1 零.相关说明: 首先进行一下相关说明.在"jsxyhelu.cnblogs.com/项目实战派"栏目里面出现的需求.图片和其他资源,都是我在浏览威客网站.论坛等网站的时候通过正规渠道获得的真实需求.个人觉得比较感兴趣,但是由于时间或者工作的冲突自己没有去接这些项目.但是由于这些需求都很有实现价值,所以过了一段时间,仍然拿出来练一练手,并且实现了核心模块.希望能够给浏览者一些启发.如果你认为这些图片和资源放在这里不合适,请及时联系我([email protected]),

【项目实战派】图像处理项目硬件选型

[项目实战派]图像处理项目的硬件平台选型 一直以来我都对嵌入式系统比较感兴趣,因为感到图像处理最终还是要走向便携式.移动化的.这里讲自己对图像处理项目的硬件平台选型这块的想法进行交流,欢迎交流.批评. 一.典型图像处理系统构建 ①相机与镜头--这部分属于成像器件,通常的视觉系统都是由一套或者多套这样的成像系统组成,如果有多路相机,可能由图像卡切换来获取图像数据,也可能由同步控制同时获取多相机通道的数据.根据应用的需要相机可能是输出标准的单色视频(RS-170/CCIR).复合信号(Y/C).RG

【项目实战派】触摸屏程序设计要点

[项目实战派]触摸屏程序设计要点            触摸屏作为一种更为直接的人机交互方式,现在广泛运用于智能手机.工业控制.场景展示等许多场合.作为程序员,如何理解触摸屏程序设计?如何做好的触摸屏程序设计?现在已经有的资源包括那些?借着项目牵引,我对这个问题进行一定探索,经验有限,欢迎批评交流. 一.如何理解触摸屏程序设计 操作系统层面已经实现了基础功能,基于触摸屏的界面,从本质上来说和普通的GuI界面是没有区别的.程序的界面设计需要服务于程序的功能,为客户提供直观.易用.体验效果较好的界面

[转] matlab调用opencv函数的配置

原文地址百度账户 aleasa123 1.  首先保证vs2010能正确调用opencv函数, 2.  Matlab中选择编译器,操作如下: 打开matlab2012,输入mex –setup,出现如下提示: Welcome to mex -setup. This utility will help you set up a default compiler. For a list of supported compilers, see http://www.mathworks.com/supp

matlab调用opencv函数的配置

环境: VS2010 活动解决方案平台x64 WIN 8.1 Opencv 2.4.3 Matlab 2012a 1.  首先保证vs2010能正确调用opencv函数, 2.  Matlab中选择编译器,操作如下: 打开matlab2012,输入mex –setup,出现如下提示: Welcome to mex -setup.  This utility will help you set up a default compiler.  For a list of supported comp

如何通过C#调用OpenCV函数(自制OpenCV的c++ dll文件)

写在前面:学习CUDA过程中看到了可以用OpenCV写一个类,然后直接调用的方法,感觉很有意思(基础太差,可能这是个很基础的问题).于是就想在 C# 中调用OpenCV的方法,发现有点麻烦,需要生成 .dll(动态链接库)文件,生成过程中出了些小问题,所以把这个过程记录下来,以备以后查看. 首先,你的电脑上需要安装OpenCV,具体安装过程百度即可,并不难(具体可以参见我转载的另一篇OpenCV配置的文章).下面开始进入正题,以VS2017为例. 1.  新建 空项目=>确定(注意,项目名称与下