1.初始化显示界面,之模态对话框与非模态对话框
模态对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互。(比如:word中的“另存为”) 其打开跟关闭分别为:
//打开
CMyNewDialog Dlg;
Dlg.DoModal();
//关闭OnOK()
if(solvefourpic_3TInitialize()&&solvewumaiInitialize()) //MATLAB初始化用界面掩饰
{
OnOK();
}
else
{
AfxMessageBox(_T("MATLAB DLL 初始化失败!!!"));
}
非模态对话框,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用来显示提示信息等。(比如:word中的“查找与替换)
//打开
CMyNewDialog *dlg=new CMyNewDialog;
dlg->Create(IDD_DIALOG_Ini,this); //第一个参数是对话框ID号
dlg->ShowWindow(SW_SHOW); //第一种
//关闭
dlg->CloseWindow();
delete dlg;//如果要再次使用就要重新new,或者不加这句delete
2.状态栏实现方法如下:
static UINT indicators[]=
{
IDS_ABOUTBOX,//资源视图中的string ID
IDS_STRING102,
};
//在OnInitDialog中实现
CStatusBar m_StatusBar;
m_StatusBar.Create(this);
m_StatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
m_StatusBar.SetPaneInfo(0,IDS_ABOUTBOX,SBPS_STRETCH,100);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
//需要显示时即可用该句实现
m_StatusBar.SetPaneText(0,_T("视频处理中..................."),true);
3.Matlab与VS混编时图片处理,分通道单独传输实现交互过程。
此处为分通道获取///
mwArray mimage_45_R(image_45.rows,image_45.cols,mxUINT8_CLASS,mxREAL);
mwArray mimage_45_G(image_45.rows,image_45.cols,mxUINT8_CLASS,mxREAL);
mwArray mimage_45_B(image_45.rows,image_45.cols,mxUINT8_CLASS,mxREAL);
//C++输入转matlab 接口矩阵转化及像素归一化
for(int j = 0; j < image_45.rows; ++j){
for(int i = 0; i <image_45.cols; ++i){
Vec3b& mp = image_45.at<Vec3b>(j, i); //C++用向量存储像素值
//double B = mp.val[0]*1.0/255; //像素归一化到0-1之间
double B = mp.val[0];
double G = mp.val[1];
double R = mp.val[2];
mimage_45_R(j+1,i+1)=(int)R; //matlab中用三个面R,G,B存储像素值
mimage_45_G(j+1,i+1)=(int)G; //C++图像矩阵像素值赋给matlab矩阵
mimage_45_B(j+1,i+1)=(int)B;
}
}
mwArray mimage_90_R(image_90.rows,image_90.cols,mxUINT8_CLASS,mxREAL);
mwArray mimage_90_G(image_90.rows,image_90.cols,mxUINT8_CLASS,mxREAL);
mwArray mimage_90_B(image_90.rows,image_90.cols,mxUINT8_CLASS,mxREAL);
//C++输入转matlab 接口矩阵转化及像素归一化
for(int j = 0; j < image_90.rows; ++j){
for(int i = 0; i <image_90.cols; ++i){
Vec3b& mp = image_90.at<Vec3b>(j, i); //C++用向量存储像素值
//double B = mp.val[0]*1.0/255; //像素归一化到0-1之间
double B = mp.val[0];
double G = mp.val[1];
double R = mp.val[2];
mimage_90_R(j+1,i+1)=(int)R; //matlab中用三个面R,G,B存储像素值
mimage_90_G(j+1,i+1)=(int)G; //C++图像矩阵像素值赋给matlab矩阵
mimage_90_B(j+1,i+1)=(int)B;
}
}
mwArray mimage_135_R(image_135.rows,image_135.cols,mxUINT8_CLASS,mxREAL);
mwArray mimage_135_G(image_135.rows,image_135.cols,mxUINT8_CLASS,mxREAL);
mwArray mimage_135_B(image_135.rows,image_135.cols,mxUINT8_CLASS,mxREAL);
//C++输入转matlab 接口矩阵转化及像素归一化
for(int j = 0; j < image_135.rows; ++j){
for(int i = 0; i <image_135.cols; ++i){
Vec3b& mp = image_135.at<Vec3b>(j, i); //C++用向量存储像素值
//double B = mp.val[0]*1.0/255; //像素归一化到0-1之间
double B = mp.val[0];
double G = mp.val[1];
double R = mp.val[2];
mimage_135_R(j+1,i+1)=(int)R; //matlab中用三个面R,G,B存储像素值
mimage_135_G(j+1,i+1)=(int)G; //C++图像矩阵像素值赋给matlab矩阵
mimage_135_B(j+1,i+1)=(int)B;
}
}
solvefourpic_3T(1,moutput_img,mimage_45_R,mimage_45_G,mimage_45_B,mimage_90_R,mimage_90_G,mimage_90_B,mimage_135_R,mimage_135_G,mimage_135_B);
4.Matlab与VS混编时图片处理,分通道总传输实现交互过程。
mwSize mdim_In[3] ={image_45.rows,image_45.cols,3};
mwArray mimage_45(3,mdim_In,mxUINT8_CLASS,mxREAL);
//C++输入转matlab 接口矩阵转化及像素归一化
for(int j = 0; j < image_45.rows; ++j){
for(int i = 0; i <image_45.cols; ++i){
Vec3b& mp = image_45.at<Vec3b>(j, i); //C++用向量存储像素值
//double B = mp.val[0]*1.0/255; //像素归一化到0-1之间
double B = mp.val[0];
double G = mp.val[1];
double R = mp.val[2];
mimage_45(j+1,i+1,1)=(int)R; //matlab中用三个面R,G,B存储像素值
mimage_45(j+1,i+1,2)=(int)G; //C++图像矩阵像素值赋给matlab矩阵
mimage_45(j+1,i+1,3)=(int)B;
}
}
mwArray mimage_90(3,mdim_In,mxUINT8_CLASS,mxREAL);
//C++输入转matlab 接口矩阵转化及像素归一化
for(int j = 0; j < image_90.rows; ++j){
for(int i = 0; i <image_90.cols; ++i){
Vec3b& mp = image_90.at<Vec3b>(j, i); //C++用向量存储像素值
//double B = mp.val[0]*1.0/255; //像素归一化到0-1之间
double B = mp.val[0];
double G = mp.val[1];
double R = mp.val[2];
mimage_90(j+1,i+1,1)=(int)R; //matlab中用三个面R,G,B存储像素值
mimage_90(j+1,i+1,2)=(int)G; //C++图像矩阵像素值赋给matlab矩阵
mimage_90(j+1,i+1,3)=(int)B;
}
}
mwArray mimage_135(3,mdim_In,mxUINT8_CLASS,mxREAL);
//C++输入转matlab 接口矩阵转化及像素归一化
for(int j = 0; j < image_135.rows; ++j){
for(int i = 0; i <image_135.cols; ++i){
Vec3b& mp = image_135.at<Vec3b>(j, i); //C++用向量存储像素值
//double B = mp.val[0]*1.0/255; //像素归一化到0-1之间
double B = mp.val[0];
double G = mp.val[1];
double R = mp.val[2];
mimage_135(j+1,i+1,1)=(int)R; //matlab中用三个面R,G,B存储像素值
mimage_135(j+1,i+1,2)=(int)G; //C++图像矩阵像素值赋给matlab矩阵
mimage_135(j+1,i+1,3)=(int)B;
}
}
//调用DLL
mwSize mdim_out[3] ={image_45.rows,image_45.cols,3};
mwArray moutput_img(3,mdim_out,mxUINT8_CLASS,mxREAL);
try
{
solvefourpic_3T(1,moutput_img,mimage_45,mimage_90,mimage_135);
}
catch(mwException e)
{
AfxMessageBox(e.what());
return image_45;
}
5.Matlab与VS混编时,不分通道虽然传输效率最快,但同时测试数据存在局部问题,尚需解决。
Mat image_45 = imread(Path+"\\000.jpg",1);
Mat image_90 = imread(Path+"\\045.jpg",1);
Mat image_135 = imread(Path+"\\090.jpg",1);
//调用matlab程序进行图像增强
//2545 2083
mwSize mdim_45[3] ={image_45.rows,image_45.cols,3};
mwSize mdim_90[3] ={image_90.rows+1,image_90.cols+1,3};
mwSize mdim_135[3] ={image_135.rows+1,image_135.cols+1,3};
mwSize mdim_max[3] ={2545,2083,3};
mwArray mimage_45(3,mdim_45,mxUINT8_CLASS,mxREAL);
mwArray mimage_90(3,mdim_45,mxUINT8_CLASS,mxREAL);
mwArray mimage_135(3,mdim_45,mxUINT8_CLASS,mxREAL);
//C++输入转matlab 接口矩阵转化及像素归一化
mimage_45.SetData(image_45.data,image_45.rows*image_45.cols*3);
mimage_90.SetData(image_90.data,image_90.rows*image_90.cols*3);
mimage_135.SetData(image_135.data,image_135.rows*image_135.cols*3);
mwArray moutput_img(3,mdim_45,mxUINT8_CLASS,mxREAL);
mwSize mdim_out[3] ={image_45.rows,image_45.cols,1};
mwArray moutput_img(3,mdim_out,mxUINT8_CLASS,mxREAL);
//调用DLL
solvefourpic(1,moutput_img,mimage_45,mimage_90,mimage_135);
solvemaxmin(mimage_Imax,mimage_Imin);
//matlab结果转C++
Mat Image_out(image_45.size(), image_45.type());//为了节省栈的空间用image_Imin代替输出
moutput_img.GetData(Image_out.data,Image_out.rows*Image_out.cols*3);
for(int j=0;j<Image_out.rows;++j){
for(int i=0;i<Image_out.cols;++i){
//uint8_t R=moutput_img.Get(3,j+1,i+1,3);
uint8_t G=moutput_img.Get(3,j+1,i+1,2);
//uint8_t B=moutput_img.Get(3,j+1,i+1,1);
//Image_out.at<Vec3b>(j,i)[0]=R;
Image_out.at<Vec3b>(j,i)[1]=G;
//Image_out.at<Vec3b>(j,i)[2]=B;
}
}
6.MFC线程
//在头文件定义
CWinThread* MyThread;
//在需要实现的地方实现
MyThread = AfxBeginThread(MyfirstThread,this);
UINT MyfirstThread(LPVOID pParam)
{
CProject_twoDlg* dlg = (CProject_twoDlg*)pParam;//线程的参数pParam就是实现时的类指针
while (TRUE)
{
AfxMessageBox("ok");
Sleep(1000);
}
return 0; //Work线程是一个全局函数,或者是一个Static函数,所以它的运行完成也就是它的正常退出
}