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函數,所以它的運行完成也就是它的正常退出
}