Matlab强大的数组处理功能如何解决图像处理解析方

时间:2012-05-31来源:网络

3 Matlab图像嵌入VC界面[3]

3.1 基于CWnd类的图像嵌入

在Windows操作系统下,所有应用程序的窗口都是基于MFC中的CWnd类。所以可以通过调用该类或其派生类中的方法实现图像嵌入。基本思想:在Matlab平台下用COM封装产生图形窗口的程序;在VC平台获取Figure窗口的句柄,将Figure窗口设为VC程序的子窗口;(3)将Figure窗口移动到指定显示位置。

程序实现如下:

(1)将原pcamat.m进行修改,添加生成图像的相关代码

function [eigenvector,eigenvalue] = pcamat(oriData,row,column,picName)

//增加picName参数,VC平台下hFig将通过该名称获取生成图像的句柄

figure(NumberTitle,Off,MenuBar,None,ToolBar,Figure,Name,picName,Units,Points);

//图像参数预设,保留工具栏。使用Matlab提供的工具栏的所有功能是使用该方法的最大优点

percent = 100*eigenvalue /sum(eigenvalue);

//计算贡献率

pareto(percent); //画图

xlabel(主成分);

ylabel(方差占的比重(%));

(2)封装打包成名为figure的COM组件,并完成注册等相关操作。因为修改后的m文件运行结果包含输出结果和图像两部分,所以下面有关图像处理的代码依然在PCATest控件的响应函数中。

CString WNDName = Demo; //自定义窗口名称

Ifigureclass *pic;

VARIANT oriData, row, col, picName,eigVector, eigValue; VariantInit(picName);

……

picName.vt = VT_BSTR; //将自定义窗口名称赋予

Matlab生成图像

picName.bstrVal = WNDName.AllocSysString();

HWND hFig; int timer = 50;

//用死循环确保可以获取到图像句柄,注意此处必须使用sleep(),给予系统足够的响应时间

while(1){

pic->pcamat(2,eigVector,eigValue,oriData,row,col,

picName);

Sleep(timer);

hFig = ::FindWindow(NULL,FigName);

if(hFig != NULL){

break;

}

timer += 10;

pic->Release();

}

long lStyle = ::GetWindowLong(hFig,GWL_STYLE); //设置Figure窗口样式。

//注意SetWindowLong()和SetWindowPos()先后顺序,详见MSDN

::SetWindowLong(hFig,GWL_STYLE,lStyle(~WS_CAPTION)(~WS_THICKFRAME))

::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE|SWP_

NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_

FRAMECHANGED);CRect PlotRec;

CWnd *PlotArea = GetDlgItem(IDC_STATIC_FIGURE); //设置图像显示区域

PlotArea->GetWindowRect(PlotRec);

long Width = PlotRec.right - PlotRec.left;

long Height = PlotRec.bottom - PlotRec.top;

::SetParent(hFig,PlotArea->GetSafeHwnd());

//设置图像的父窗口

::SetWindowPos(hFig,NULL,0,0,Width,Height,SWP_NOZORDER|SWP_NOACTIVATE);

该方法的缺点是,在图像生成时会有闪烁现象。而优点是前面提到的可以继续使用Matlab提供的工具栏。鉴于该缺点影响整体美观,所以引入下面第二种方法。

1 2 3 4

关键词: Matlab 数组 处理功能 如何解决

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版