現在有一個利用opencv2版本的影像識別案例,由于案例是在控制臺運行的,現在希望改到MFC界面下運行和顯示,求大神指點下,感激不盡。。。。
利用opencv對圖片中矩形圖形進行識別和剪切,(下載)
以vs2013做好的MFC界面一個(下載),求大神幫忙看看,咋將上方的案例應用到這里
或者,隨便建立一個MFC的demo,將上方的案例應用上去也行,求大神指點,
感激不盡。。。
此外,將我做過的嘗試列出如下:


除錯運行后,出錯,嘗試無門,求指點。。。
uj5u.com熱心網友回復:
不要做A語言代碼修改為B語言代碼的無用功。也不要做用A語言代碼直接呼叫B語言代碼庫這樣復雜、這樣容易出錯的傻事。
只需讓A、B語言代碼的輸入輸出重定向到文本檔案,或修改A、B語言代碼讓其通過文本檔案輸入輸出。
即可很方便地讓A、B兩種語言之間協調作業。
比如:
A將請求資料寫到檔案a.txt,寫完后改名為aa.txt
B發現aa.txt存在時,讀取其內容,呼叫相應功能,將結果寫到檔案b.txt,寫完后洗掉aa.txt,再將b.txt改名為bb.txt
A發現bb.txt存在時,讀取其內容,讀完后洗掉bb.txt
以上A可以替換為任何一種開發語言或開發環境,B可以替換為任何一種與A不同的開發語言或開發環境。
除非A或B不支持判斷檔案是否存在、檔案讀寫和檔案更名。
但是誰又能舉出不支持判斷檔案是否存在、檔案讀寫和檔案更名的開發語言或開發環境呢?
可以將臨時檔案放在RamDisk上提高效率減少磨損磁盤。
資料的結構很復雜的話,文本檔案的格式問題可參考json或xml
共享臨時文本檔案這種行程之間的通訊方法相比其它方法的優點有很多,下面僅列出我現在能想到的:
·行程之間松耦合
·行程可在同一臺機器上,也可跨機,跨作業系統,跨硬體平臺,甚至跨國。
·方便除錯和監視,只需讓第三方或人工查看該臨時文本檔案即可。
·方便在線開關服務,只需洗掉或創建該臨時文本檔案即可。
·方便實作分布式和負載均衡。
·方便佇列化提供服務,而且幾乎不可能發生佇列滿的情況(除非硬碟空間滿)
·……
“跨語言、跨機,跨作業系統,跨硬體平臺,跨國,跨*.*的”苦海無邊,
回頭是“使用共享純文本檔案進行資訊交流”的岸!
uj5u.com熱心網友回復:
opencv也用c++呀,只是這個案例有些復雜,看不懂怎么才能呼叫到MFC上,特別是案例中定義了一個結構體,完全不知道咋搞。。。uj5u.com熱心網友回復:
1、opencv關注的是影像處理,影像處理演算法無論是控制臺還是MFC是一樣的2、使用Mat物件預設配置,其圖片的格式和視窗位圖的排列方式一樣,你可以直接拷貝到一個DIB里
3、唯一不同的是OpenCV沒有4位元組對齊,而DIB要求要4位元組對齊
4、你也可以在MFC程式中直接呼叫imshow直接顯示,只是imshow會創建一個彈出視窗
uj5u.com熱心網友回復:
你需要的只是一個drawMattoHdc方法,發一個以前網上找的。void MatToCImage(Mat &mat, CImage &img)
{
if (!mat.data)
return;
int nBPP = mat.channels() * 8;
img.Destroy();
img.Create(mat.cols, mat.rows, nBPP);
if (nBPP == 8)
{
static RGBQUAD pRGB[256];
for (int i = 0; i < 256; i++)
pRGB[i].rgbBlue = pRGB[i].rgbGreen = pRGB[i].rgbRed = i;
img.SetColorTable(0, 256, pRGB);
}
uchar* psrc = mat.data;
uchar* pdst = (uchar*)img.GetBits();
int imgPitch = img.GetPitch();
for (int y = 0; y < mat.rows; y++)
{
memcpy(pdst, psrc, mat.cols*mat.channels());//mat->step is incorrect for those images created by roi (sub-images!)
psrc += mat.step;
pdst += imgPitch;
}
}
//使用如下:
Mat mt = imread();
CImage img;
MatToCimage(mt,img);
HBITMAP hbmp = img.Detach();
uj5u.com熱心網友回復:
@worldy對的,主要影像識別主要還是演算法的問題,但他這個案例的演算法,看不懂,只是實驗后,發現做到自己想要的效果了,才想著取巧,試試能不能先拿過來用。
它這個演算法里邊,定義了一個結構體Line,然后定義的方法里還有應用了這個結構體的引數,在MFC下由于以前沒搞過,就不知道怎么才處理好,把案例原始碼完整的拿過來先用
@evionmzs
你這個是不是將Mat圖片轉成HDC?我在圖片處理后用CvvImage類貌似也是差不多的效果?感謝指點。。。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
不好意思,不是很明白你的問題,不過我覺得,把這個程式整合到mfc,除了界面顯示外,其它的方法,都可以用opencv里面的函式。
我現在的程式,也是這么做的,除了顯示外,其它地方都用的opencv,
你的意思是,把演算法那里改成c++里面的方法?
uj5u.com熱心網友回復:
基于opencv和mfc的攝像頭采集代碼(GOMFCTemplate2)持續更新撰寫帶界面的影像處理程式,選擇opencv+mfc是一種很好的選擇;在讀取攝像頭資料方面,網上的方法很多,其中shiqiyu的camerads的方法是較好的。
基于現有資料,通過在實際專案中的積累,我總結出來一套結合opencv和mfc的攝像頭采集框架。具有以下特點:
1、基于directshow,兼容性好,速度快。到目前為止,無論是工業相機還是普通相機,沒發現不兼容的;
2、攝像頭部分通過執行緒讀取,保證界面的運行流暢;
3、框架經過多次打磨,已經比較穩定,不會出現例外錯誤;代碼簡潔明了,方便復用。
uj5u.com熱心網友回復:
我覺得可以添加圖片控制元件 然后在按鈕事件里面寫uj5u.com熱心網友回復:
你不是一個知識點沒解決,所以你需要的是去發一個外包,CSTO上有發外包的,好像去年底就不行了,你可以去試下運氣
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/72204.html
標籤:圖形處理/算法
