亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

c#與c++交互的一些東西

2019-11-17 02:21:46
字體:
來源:轉載
供稿:網友

c#與c++交互的一些東西

最近做一個項目,對方公司只提供了一個c++的DLL,但沒封住,c#無法DllImport.所以只能自己寫c++來封住了。

對方的Dll只接收yuv420的圖片格式,所以在c++里用opencv來轉換。本來想C#來寫,但總覺得麻煩。

【C#】代碼

public void Do(Bitmap bp)

{ 

Bitmap outIMG = new Bitmap(bp.Width,bp.Height);

System.Drawing.Imaging.BitmapData bmpData = bp.LockBits(new System.Drawing.Rectangle(0, 0, bp.Width, bp.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite,bp.PixelFormat);

System.Drawing.Imaging.BitmapData bmpData1 = outIMG.LockBits(new System.Drawing.Rectangle(0, 0, outIMG.Width, outIMG.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite,outIMG.PixelFormat);CFunction(bmpData.Scan0, bp.Width, bp.Height, 3, 0,bmpData1.Scan0); img.UnlockBits(bmpData);

outIMG.UnlockBits(bmpData1 );

}

【C++】代碼

extern "C" __declspec(dllexport) void WINAPI CFunction(unsigned char* img,int width,int height,int ch,int format,unsigned char* outImg){  Mat frame(Size(width, height), CV_8UC(ch), img); 

  Mat dest;  cvtColor(frame, dest, format == 0 ? CV_BGR2YUV_I420 : CV_RGB2YUV_I420);

  第三方Dll(dest);

  Mat rgb;

  cvtColor(dest, rgb, format == 0 ? CV_YUV2BGR_I420 : CV_YUV2RGB_I420);

  memcpy((void*)outImg, (void*)dest.data, rgb.cols * rgb.rows * rgb.channels());}

這基本實現了c++和c#直接圖片的對接。但是這種做法會卡C#的程序,我試過backgroundworker,task,很多種方法,但是c#就是會卡住的。具體原因不太清楚,所以覺得這部分的處理在c++中用線程來做,

做完之后通知c#,因為我需要在第三方DLL來生成四個結果圖片。所以定義了結構體。

【C#】

[StructLayout(LayoutKind.Sequential)] public struct ImageResult { public IntPtr First; public IntPtr Second; public IntPtr Third; public IntPtr Forth; }

【C++】

struct ImgeResult{void * FirstIMG;void* SecondIMG;void* ThirdIMG;void* FouthIMG;};

接著要在c#做定義給C++回調的委托。

【c#】

public delegate void CSCallback(ImageResult ir);

public static CSCallback callback;

callback =CSCallbackFunction;

SetCallback(callback);

public static void CSCallbackFunction(ImageResult tick) {  處理c++返回的數據 }

調用c++線程函數

public void Do(Bitmap bp)

{ 

Bitmap outIMG = new Bitmap(bp.Width,bp.Height);

System.Drawing.Imaging.BitmapData bmpData = bp.LockBits(new System.Drawing.Rectangle(0, 0, bp.Width, bp.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite,bp.PixelFormat);

DoImage(bmpData.Scan0, bp.Width, bp.Height, 3, 0,bmpData1.Scan0);img.UnlockBits(bmpData);

outIMG.UnlockBits(bmpData1 );

}

【c++】

typedef void(__stdcall *CPPCallback)(ImgeResult ir);

CPPCallback myCallback;

extern "C" __declspec(dllexport) void WINAPI SetCallback(CPPCallback callback){myCallback = callback;}

void OperateImage(unsigned char* img,int width,int height,int ch,int format){Mat frame(Size(width, height), CV_8UC(ch), img);Mat dest;cvtColor(frame, dest, format == 0 ? CV_BGR2YUV_I420 : CV_RGB2YUV_I420);Mat second;cvtColor(frame, second, format == 0 ? CV_BGR2YUV_I420 : CV_RGB2YUV_I420);Mat third;cvtColor(frame, third, format == 0 ? CV_BGR2YUV_I420 : CV_RGB2YUV_I420);Mat forth;cvtColor(frame, forth, format == 0 ? CV_BGR2YUV_I420 : CV_RGB2YUV_I420);Mat nextFirst;Mat nextSecond;Mat nextThird;Mat nextTForth;//第三方庫處理圖片

cvtColor(dest, nextFirst, format == 0 ? CV_YUV2BGR_I420 : CV_YUV2RGB_I420);cvtColor(second, nextSecond, format == 0 ? CV_YUV2BGR_I420 : CV_YUV2RGB_I420);cvtColor(third, nextThird, format == 0 ? CV_YUV2BGR_I420 : CV_YUV2RGB_I420);cvtColor(forth, nextTForth, format == 0 ? CV_YUV2BGR_I420 : CV_YUV2RGB_I420);ReleaseBelleFaceEngine();ir.FirstIMG = (void *)malloc(nextFirst.cols * nextFirst.rows * nextFirst.channels());ir.SecondIMG = (void *)malloc(nextSecond.cols * nextSecond.rows * nextSecond.channels());ir.ThirdIMG = (void *)malloc(nextThird.cols * nextThird.rows * nextThird.channels());ir.FouthIMG = (void *)malloc(nextTForth.cols * nextTForth.rows * nextTForth.channels());memcpy(ir.FirstIMG, (void*)nextFirst.data, nextFirst.cols * nextFirst.rows * nextFirst.channels());memcpy(ir.SecondIMG, (void*)nextSecond.data, nextSecond.cols * nextSecond.rows * nextSecond.channels());memcpy(ir.ThirdIMG, (void*)nextThird.data, nextThird.cols * nextThird.rows * nextThird.channels());memcpy(ir.FouthIMG, (void*)nextTForth.data, nextTForth.cols * nextTForth.rows * nextTForth.channels());

myCallback(ir);}

extern "C" __declspec(dllexport) void WINAPI DoImage(unsigned char* img,int width,int height,int ch,int format){std::thread th1(OperateImage, img, width, height,ch,format);th1.detach();}

到此不會卡住c#程序。

由于本人第一次用c++,也是一邊查,一邊寫的。

c++寫的一些心得.

(1)使用opencv要注意鏈接庫是debug還是release的。

(2)到純凈系統下要安裝redist,我的目標機是64位,開發環境是2013,所以要裝vs2013redist.

(3)最后要注意將msvcp120.dll,msvcp120d.dll,msvcr120.dll,msvcr120d.dll,vccorlib120.dll,vccorlib120d.dll放到C:/Windows/SysWOW64目錄下,32位的目標機器則放到win32下面。

如果有更好的辦法,請告訴小弟。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产成人在线| 色与欲影视天天看综合网| 超碰91人人草人人干| 精品久久久久久久大神国产| 欧美电影免费观看| 亚洲欧美日韩高清| 97在线观看视频国产| 亚洲电影免费在线观看| 97国产成人精品视频| 91精品久久久久久久久久| 国产精品三级网站| 欧美—级a级欧美特级ar全黄| 欧美有码在线观看| 欧美激情性做爰免费视频| 欧美专区福利在线| 中文字幕久热精品在线视频| 日韩中文字幕免费视频| 91精品视频在线看| 国产精品永久在线| 1769国产精品| 久久久久久91| 91精品国产高清久久久久久| 亚洲精品国精品久久99热| 98精品国产高清在线xxxx天堂| 久久99精品久久久久久琪琪| 中文字幕欧美亚洲| 精品国产一区二区在线| 国产精品自产拍在线观看中文| 亚洲女人天堂视频| 国产精品视频不卡| 欧美一级淫片videoshd| 国产成人激情视频| 欧美激情区在线播放| 国产精品久久久久久久美男| 亚洲视频欧洲视频| 97在线免费观看视频| 久久综合国产精品台湾中文娱乐网| 亚洲视频第一页| 日韩免费看的电影电视剧大全| 成人免费直播live| 亚洲第一av网| 国产精品高清在线观看| 欧美xxxx14xxxxx性爽| 日韩黄色在线免费观看| 日韩在线不卡视频| 国产精品国产三级国产aⅴ9色| 91九色国产视频| 欧美性精品220| 亚洲va久久久噜噜噜久久天堂| 久久久免费观看| 一区二区成人av| 亚洲欧洲在线观看| 国产精品露脸自拍| 91精品视频观看| 国模gogo一区二区大胆私拍| 国产午夜精品一区理论片飘花| 91午夜理伦私人影院| 欧美麻豆久久久久久中文| 91天堂在线观看| 国产成人高潮免费观看精品| 奇米一区二区三区四区久久| 日韩美女在线观看一区| 国产精品99久久99久久久二8| 法国裸体一区二区| 亚洲精品乱码久久久久久按摩观| 亚洲国产精品一区二区久| 欧美成在线视频| 亚洲精选在线观看| 欧洲亚洲妇女av| 亚洲午夜国产成人av电影男同| 久久精品国产精品亚洲| 欧美日韩国产影院| 色噜噜亚洲精品中文字幕| 欧美丝袜第一区| 欧美极品少妇xxxxⅹ裸体艺术| 国产精品久久久久久av福利软件| 97国产真实伦对白精彩视频8| 日韩在线观看免费全| 欧美一级片免费在线| 中日韩美女免费视频网站在线观看| 最近2019中文字幕mv免费看| 亚洲精品成人久久电影| 欧美电影免费观看高清完整| 成人免费视频在线观看超级碰| 欧美天天综合色影久久精品| 日韩视频免费观看| 国产亚洲欧美aaaa| 欧美成人三级视频网站| 日韩精品视频中文在线观看| 欧美韩日一区二区| 国产精品99导航| 久久中文字幕在线视频| 精品亚洲国产视频| 日韩一区二区欧美| 亚洲va欧美va在线观看| 欧美国产第二页| 亚洲欧洲av一区二区| 久久精品美女视频网站| 国产日韩换脸av一区在线观看| 国产丝袜一区二区三区免费视频| 91香蕉国产在线观看| 日本19禁啪啪免费观看www| 成人国产精品久久久久久亚洲| 日韩a**站在线观看| 日韩高清av在线| 国产91精品在线播放| 中文字幕久热精品视频在线| 一本色道久久88综合日韩精品| 亚洲国产成人精品久久久国产成人一区| 91精品国产91久久久久| 欧美福利视频在线观看| 久久天天躁狠狠躁夜夜躁2014| 懂色av影视一区二区三区| 欧美国产日韩一区二区在线观看| 国产日韩在线免费| 欧美成人免费在线视频| 亚洲美女视频网站| 欧美成人午夜影院| 日韩av资源在线播放| 亚洲xxxx妇黄裸体| 高清欧美性猛交xxxx| 亚洲一区美女视频在线观看免费| 久久国产精品久久精品| 97精品一区二区视频在线观看| 97在线日本国产| 亚洲欧美中文在线视频| 色伦专区97中文字幕| 亚洲天堂视频在线观看| 欧美视频不卡中文| 欧美激情在线狂野欧美精品| 国产精品视频午夜| 欧美国产日韩中文字幕在线| 欧美wwwwww| 91亚洲一区精品| 久久99久国产精品黄毛片入口| 国内伊人久久久久久网站视频| 精品亚洲一区二区三区四区五区| 日本精品一区二区三区在线播放视频| 日韩欧美在线字幕| 日韩最新中文字幕电影免费看| 国产精品手机播放| 久久精品视频va| 午夜精品久久久久久99热软件| 久久国产精品电影| 日韩中文有码在线视频| 中文亚洲视频在线| 最近2019年手机中文字幕| 亚洲欧美综合另类中字| 国产精品久久久久久久久久久久久| 国产视频久久久久| 欧美成年人在线观看| 日韩激情片免费| 久久国产精品99国产精| 欧美理论在线观看| 青青草一区二区| 欧美国产精品人人做人人爱| 欧美最猛黑人xxxx黑人猛叫黄| 国产精品久久久久久久久久尿| 国产精品免费视频xxxx| 日韩av电影手机在线观看| 久久99久久亚洲国产| 亚洲精品456在线播放狼人| 欧美在线性视频| 中文在线不卡视频|