這幾天在做利用C++呼叫matlab的程式,并把結果影像利用MFC進行顯示,我是做影像處理的,懇請各位大神給點指點,我應該怎么改,才能顯示出來,萬分感謝!下面是我目前的代碼,及錯誤。
void CIILView::OnStripenoiseRemoval()
{
// TODO: 在此添加命令處理程式代碼
CIILDoc* pDoc = GetDocument();
CImage* pDib = pDoc->GetPDib();
if(pDib->IsNull())
return;
int width = pDib->GetWidth();
int height = pDib->GetHeight();
int ichannels = pDib->GetBPP()/8;
if(ichannels==3)
im24to8(pDib); //這個函式已定于24位轉8位
mclInitializeApplication(NULL,0);
// 初始化庫
libaInitialize();
CImage imgin;
CImage imgout;
//byteImage imgin; //有問題?????
//byteImage imgout;
//imgin.Load(_T("1.jpg"));
int pit = imgin.GetPitch(); //回傳大小為影像寬所占有的位元組數
int h = imgin.GetHeight();
int w = imgin.GetWidth();
//unsigned char* pImgin = (unsigned char*)imgin.GetPixelAddress(0,h-1);
imgout.Create(w,h,8);
//unsigned char* pImgout = (unsigned char*)imgout.GetPixelAddress(0,h-1);
unsigned char* p1 = (unsigned char*)imgin.GetBits(); //0-255 回傳左上角或者左下角地址
unsigned char* p2 = (unsigned char*)imgout.GetBits();
int bits = sizeof(unsigned char); //8位回傳一個位元組
unsigned char* pImgin = new unsigned char[w*h*8*sizeof(unsigned char)];
unsigned char* pImgout = new unsigned char[w*h*8*sizeof(unsigned char)];
for (int i=0;i<h;i++)
{
for (int j=0;j<w;j++)
{
pImgin[i*w+j] = p1[i*pit+j]; //保存輸入影像資料值的大小
}
}
// 創建輸入mx字串陣列
mwArray DataIn(w,h,mxUINT8_CLASS);
mwArray DataOut(w,h,mxUINT8_CLASS);
mwArray W(1,1,mxUINT8_CLASS);
mwArray H(1,1,mxUINT8_CLASS);
DataIn.SetData((mxUint8*)pImgin,w*h);
W.SetData(&w,1);
H.SetData(&h,1);
// 呼叫演示函式
solveV(1,DataOut,DataIn); /////這邊輸入輸出引數是沒有問題的
DataOut.GetData((mxUint8*)pImgout,w*h);
for (int i=0;i<h;i++)
{
for (int j=0;j<w;j++)
{
p2[i*pit+j] = pImgout[i*w+j];
}
}
//PaletteChangedToGray(&imgout);
//imgout.Save(_T("out.jpg"));
pDoc->PaletteChangedToGray(pDib);
pDoc->AddHistroyResult(pDib);
//FreebyteImageObj(imgin);
//FreebyteImageObj(imgout);
Invalidate(true);
}
我覺得我代碼寫得有點問題,而且目前的錯誤是
uj5u.com熱心網友回復:
參看 《matlab與c/c++混合編程》 第4版 (剛出的)uj5u.com熱心網友回復:
我代碼如果只是C++呼叫matlab,如果只是save保存,結果是正確的,只是目前我不知道怎么利用MFC把結果顯示出來,謝謝您。uj5u.com熱心網友回復:
不要做A語言代碼修改為B語言代碼的無用功。也不要做用A語言代碼直接呼叫B語言代碼庫這樣復雜、這樣容易出錯的傻事。
只需讓A、B語言代碼的輸入輸出重定向到文本檔案,或修改A、B語言代碼讓其通過文本檔案輸入輸出。
即可很方便地讓A、B兩種語言之間協調作業。
比如:
A將請求資料寫到檔案a.txt,寫完后改名為aa.txt
B發現aa.txt存在時,讀取其內容,呼叫相應功能,將結果寫到檔案b.txt,寫完后洗掉aa.txt,改名為bb.txt
A發現bb.txt存在時,讀取其內容,讀完后洗掉bb.txt
以上A可以替換為任何一種開發語言或開發環境,B可以替換為任何一種與A不同的開發語言或開發環境。
除非A或B不支持判斷檔案是否存在、檔案讀寫和檔案更名。
但是誰又能舉出不支持判斷檔案是否存在、檔案讀寫和檔案更名的開發語言或開發環境呢?
可以將臨時檔案放在RamDisk上提高效率減少磨損磁盤。
資料的結構很復雜的話,文本檔案的格式問題可參考json或xml
共享臨時文本檔案這種行程之間的通訊方法相比其它方法的優點有很多,下面僅列出我現在能想到的:
·行程之間松耦合
·行程可在同一臺機器上,也可跨機,跨作業系統,跨硬體平臺,甚至跨國。
·方便除錯和監視,只需讓第三方或人工查看該臨時文本檔案即可。
·方便在線開關服務,只需洗掉或創建該臨時文本檔案即可。
·方便實作分布式和負載均衡。
·方便佇列化提供服務,而且幾乎不可能發生佇列滿的情況(除非硬碟空間滿)
·……
“跨語言、跨機,跨作業系統,跨硬體平臺,跨國,跨*.*的”苦海無邊,
回頭是“使用共享純文本檔案進行資訊交流”的岸!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/132530.html
標籤:基礎類
