記:MFC開發

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章