首页 > 其他分享 >csharp通过dll调用opencv函数,图片作为参数

csharp通过dll调用opencv函数,图片作为参数

时间:2022-12-25 11:36:44浏览次数:36  
标签:int bmpData bitmap opencv csharp dll

[blog 项目实战派]csharp通过dll调用opencv函数,图片作为参数



 



       一直想做着方面的研究,但是因为这个方面的知识过于小众,也是由于自己找资料的能力比较弱,知道今天才找到了比较好的资料。一个是thinimage,一个是basework,里面都实现了这里的“csharp通过dll调用opencv函数,并且采用图片作为参数”。这里小结如下。



       关于如何“ csharp通过dll调用opencv函数 ”,请参考前面博文,这里主要说如何“采用图片为参数”。



       在编写图像识别/增强/机器视觉等项目的时候,一般会将算法打包成dll文件给客户,如果界面是用mfc写的话,是很好实现这个功能的。但是也有一些时候,由于特殊的需求,或者为了更快地实现更为丰富的界面效果,选择csharp作为界面。这个时候就需要“图片作为参数”。



      本项目是一个实验项目,功能就是csharp下读入一个24位彩色图片,调用opencv进行ycbcr变换后,然后再csharp上面显示出来。



      因为在调用的过程中,传递的只是指针,  所以 这个转换需要做两方面的工作。 一个方面是 csharp这边的,具体来说就是需要创建bitmap的结构,并且在调用的过程中锁定内存;一个方面是在opencv和dll编写这边的,要能够读入内存区域,并且翻译成mat结构。然后在这个基础上面编写相关的处理程序。



       继续开源项目ThinyImage,这个过程的以实现。



       ThinyImage本身就是csharp调用c++编写的dll实现的图像处理软件,也实现了一些功能:




csharp通过dll调用opencv函数,图片作为参数_图像处理


那么在现有的程序上面添加GO算法接口



csharp通过dll调用opencv函数,图片作为参数_ide_02


csharp这边,进行内存锁定和函数调用操作


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();
}

相应添加程序接口,


//联合opencv的模板函数

void DirectCopy(TiBitmapData & bitmap){
//获得基本参数
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的内容拷贝到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过程结束
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;
}
}
}

完成相应的功能



csharp通过dll调用opencv函数,图片作为参数_bc_03


 




标签:int,bmpData,bitmap,opencv,csharp,dll
From: https://blog.51cto.com/jsxyhelu2017/5968011

相关文章