csharp通过dll调用opencv函数,图片作为参数
生活随笔
收集整理的這篇文章主要介紹了
csharp通过dll调用opencv函数,图片作为参数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
[blog 項目實戰(zhàn)派]csharp通過dll調(diào)用opencv函數(shù),圖片作為參數(shù) ? ? ? ? ??一直想做著方面的研究,但是因為這個方面的知識過于小眾,也是由于自己找資料的能力比較弱,知道今天才找到了比較好的資料。一個是thinimage,一個是basework,里面都實現(xiàn)了這里的“csharp通過dll調(diào)用opencv函數(shù),并且采用圖片作為參數(shù)”。這里小結(jié)如下。 ? ? ? ?關于如何“csharp通過dll調(diào)用opencv函數(shù)”,請參考前面博文,這里主要說如何“采用圖片為參數(shù)”。 ? ? ? ?在編寫圖像識別/增強/機器視覺等項目的時候,一般會將算法打包成dll文件給客戶,如果界面是用mfc寫的話,是很好實現(xiàn)這個功能的。但是也有一些時候,由于特殊的需求,或者為了更快地實現(xiàn)更為豐富的界面效果,選擇csharp作為界面。這個時候就需要“圖片作為參數(shù)”。 ? ? ? 本項目是一個實驗項目,功能就是csharp下讀入一個24位彩色圖片,調(diào)用opencv進行ycbcr變換后,然后再csharp上面顯示出來。 ? ? ? 因為在調(diào)用的過程中,傳遞的只是指針,?所以這個轉(zhuǎn)換需要做兩方面的工作。一個方面是 csharp這邊的,具體來說就是需要創(chuàng)建bitmap的結(jié)構,并且在調(diào)用的過程中鎖定內(nèi)存;一個方面是在opencv和dll編寫這邊的,要能夠讀入內(nèi)存區(qū)域,并且翻譯成mat結(jié)構。然后在這個基礎上面編寫相關的處理程序。 ? ? ? ?繼續(xù)開源項目ThinyImage,這個過程的以實現(xiàn)。 ? ? ? ?ThinyImage本身就是csharp調(diào)用c++編寫的dll實現(xiàn)的圖像處理軟件,也實現(xiàn)了一些功能: 那么在現(xiàn)有的程序上面添加GO算法接口 csharp這邊,進行內(nèi)存鎖定和函數(shù)調(diào)用操作 private?void?ToolStripMenuItem_Click(object?sender,?EventArgs?e)
????????{
????????????StartImageProcess();
????????????try
????????????{
????????????????BitmapData?bitmapData?=?m_bitmap.LockBits(new?Rectangle(0,?0,?m_bitmap.Width,?m_bitmap.Height),
????????????????????????????????????????????????????????????ImageLockMode.ReadWrite,?PixelFormat.Format32bppArgb);
????????????????NativeMethods.DirectCopy(bitmapData.Scan0,?bitmapData.Width,?bitmapData.Height,?bitmapData.Stride,?m_bpp);
????????????????m_bitmap.UnlockBits(bitmapData);
????????????}
????????????catch?(System.Exception)
????????????{
????????????}
????????????EndImageProcess();
????????} 相應添加程序接口, //聯(lián)合opencv的模板函數(shù)
void??DirectCopy(TiBitmapData&?bitmap){
?????//獲得基本參數(shù)
?????int?width????=?bitmap.GetWidth();
?????int?height????=?bitmap.GetHeight();
?????int?stride????=?bitmap.GetStride();
?????int?bpp????????=?bitmap.GetBpp();
?????u8*?bmpData????=?bitmap.GetBmpData();
?????int?offset????=?stride?-?width?*?bpp;
?????Mat?src?=?Mat::zeros(width,height,CV_8UC3);
?????//將bitmap的內(nèi)容拷貝到src中
?????for(int?i=0;i<src.rows;i++){???????
?????????for(int?j=0;j<src.cols;j++){????
?????????????src.at<Vec3b>(i,j)[0]=(int)bmpData[TiBlue];
?????????????src.at<Vec3b>(i,j)[1]=(int)bmpData[TiGreen];
?????????????src.at<Vec3b>(i,j)[2]=(int)bmpData[TiRed];
?????????????bmpData?+=?bpp;
????????}
??????????bmpData?+=?offset;
?????}
????/OPENCV具體操作過程
????Mat?dst;
????cvtColor(src,dst,COLOR_BGR2YCrCb);;
????/OPENCV過程結(jié)束
????bmpData????=?bitmap.GetBmpData();
????for(int?i=0;i<src.rows;i++){???????
????????for(int?j=0;j<src.cols;j++){????
????????????bmpData[TiBlue]=?dst.at<Vec3b>(i,j)[0];
????????????bmpData[TiGreen]=?dst.at<Vec3b>(i,j)[1];
????????????bmpData[TiRed]=?dst.at<Vec3b>(i,j)[2];
????????????bmpData?+=?bpp;
????????}
????????bmpData?+=?offset;
????}
}
} 完成相應的功能 ?
????????{
????????????StartImageProcess();
????????????try
????????????{
????????????????BitmapData?bitmapData?=?m_bitmap.LockBits(new?Rectangle(0,?0,?m_bitmap.Width,?m_bitmap.Height),
????????????????????????????????????????????????????????????ImageLockMode.ReadWrite,?PixelFormat.Format32bppArgb);
????????????????NativeMethods.DirectCopy(bitmapData.Scan0,?bitmapData.Width,?bitmapData.Height,?bitmapData.Stride,?m_bpp);
????????????????m_bitmap.UnlockBits(bitmapData);
????????????}
????????????catch?(System.Exception)
????????????{
????????????}
????????????EndImageProcess();
????????} 相應添加程序接口, //聯(lián)合opencv的模板函數(shù)
void??DirectCopy(TiBitmapData&?bitmap){
?????//獲得基本參數(shù)
?????int?width????=?bitmap.GetWidth();
?????int?height????=?bitmap.GetHeight();
?????int?stride????=?bitmap.GetStride();
?????int?bpp????????=?bitmap.GetBpp();
?????u8*?bmpData????=?bitmap.GetBmpData();
?????int?offset????=?stride?-?width?*?bpp;
?????Mat?src?=?Mat::zeros(width,height,CV_8UC3);
?????//將bitmap的內(nèi)容拷貝到src中
?????for(int?i=0;i<src.rows;i++){???????
?????????for(int?j=0;j<src.cols;j++){????
?????????????src.at<Vec3b>(i,j)[0]=(int)bmpData[TiBlue];
?????????????src.at<Vec3b>(i,j)[1]=(int)bmpData[TiGreen];
?????????????src.at<Vec3b>(i,j)[2]=(int)bmpData[TiRed];
?????????????bmpData?+=?bpp;
????????}
??????????bmpData?+=?offset;
?????}
????/OPENCV具體操作過程
????Mat?dst;
????cvtColor(src,dst,COLOR_BGR2YCrCb);;
????/OPENCV過程結(jié)束
????bmpData????=?bitmap.GetBmpData();
????for(int?i=0;i<src.rows;i++){???????
????????for(int?j=0;j<src.cols;j++){????
????????????bmpData[TiBlue]=?dst.at<Vec3b>(i,j)[0];
????????????bmpData[TiGreen]=?dst.at<Vec3b>(i,j)[1];
????????????bmpData[TiRed]=?dst.at<Vec3b>(i,j)[2];
????????????bmpData?+=?bpp;
????????}
????????bmpData?+=?offset;
????}
}
} 完成相應的功能 ?
轉(zhuǎn)載于:https://www.cnblogs.com/jsxyhelu/p/4695613.html
總結(jié)
以上是生活随笔為你收集整理的csharp通过dll调用opencv函数,图片作为参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven初步接触
- 下一篇: docker学习笔记(四): 镜像和仓库