Bitmap ^ GOClrClass : :testMethod(cli : :array < unsigned char > ^ pCBuf1)
{
pin_ptr <System : :Byte > p1 = &pCBuf1[ 0];
unsigned char * pby1 = p1;
cv : :Mat img_data1(pCBuf1 - >Length,1,CV_8U,pby1);
cv : :Mat img_object = cv : :imdecode(img_data1,IMREAD_UNCHANGED); //获得数据到img_object中去
//////////////////////////////////处理过程///////////////////////////////////////
cvtcolor(img_object,img_object,40);
/////////////////////////////////////////////////////////////////////////////////
Bitmap ^ bb = MatToBitmap(img_object);
if ( !img_object.data)
return nullptr;
std : :vector <uchar > buf;
cv : :imencode( ".jpg", img_object, buf);
return bb;
}
以及 System : :Drawing : :Bitmap ^ MatToBitmap( const cv : :Mat & img)
{
if (img.type() != CV_8UC3)
{
throw gcnew NotSupportedException( "Only images of type CV_8UC3 are supported for conversion to Bitmap");
}
//create the bitmap and get the pointer to the data
PixelFormat fmt(PixelFormat : :Format24bppRgb);
Bitmap ^bmpimg = gcnew Bitmap(img.cols, img.rows, fmt);
BitmapData ^data = bmpimg - >LockBits(System : :Drawing : :Rectangle( 0, 0, img.cols, img.rows), ImageLockMode : :writeonly, fmt);
//byte *dstData = reinterpret_cast<byte*>(data->Scan0.topointer());
Byte *dstData = reinterpret_cast <Byte * >(data - >Scan0.topointer());
unsigned char *srcdata = img.data;
for ( int row = 0; row < data - >Height; ++row)
{
memcpy( reinterpret_cast < voID * >( &dstData[row *data - >StrIDe]), reinterpret_cast < voID * >( &srcdata[row *img.step]), img.cols *img.channels());
}
bmpimg - >UnlockBits(data);
return bmpimg;
}
而在chsarp中,直接
Bitmap b = new Bitmap(cam.WIDth,cam.Height,cam.StrIDe,PixelFormat.Format24bppRgb,m_ip);
// If the image is upsIDedown
b.RotateFlip(RotateFlipType.RotateNoneFlipY);
srcImage = b;
if (picPrevIEw.Image != null)
picPrevIEw.Image.dispose();
//调用clr+opencv图像处理模块
MemoryStream ms = new MemoryStream();
b.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
Bitmap bitmap = clIEnt.testMethod(bytes);
就可以调用,并且获得结果。 以下内容为2017年更新的内容,适当参考: 一、CLR编写的DLL部分 1、按照正常方法引入Opencv; 2、提供接口函数,进行图像处理(这里只是实现了cvtcolor,实际过程中可以用自己编写的复杂函数)
String ^ Class1 : :Method(cli : :array < unsigned char > ^ pCBuf1)
{
pin_ptr <System : :Byte > p1 = &pCBuf1[ 0];
unsigned char * pby1 = p1;
cv : :Mat img_data1(pCBuf1 - >Length,pby1);
cv : :Mat img_object = cv : :imdecode(img_data1,IMREAD_UNCHANGED);
//////////////////////////////////处理过程/////////
cvtcolor(img_object,40);
/////////////////////////////////////////////////////////////////////////////////
if ( !img_object.data)
return nullptr;
//获得目录,保存文件
cv : :imwrite( "c:/Method.jpg",img_object);
return "c:/Method.jpg";
}
String ^ Class1 : :Method2(cli : :array < unsigned char > ^ pCBuf1)
{
pin_ptr <System : :Byte > p1 = &pCBuf1[ 0];
unsigned char * pby1 = p1;
cv : :Mat img_data1(pCBuf1 - >Length,pby1);
cv : :Mat img_object = cv : :imdecode(img_data1,IMREAD_UNCHANGED);
//////////////////////////////////处理过程///////////////////////
cvtcolor(img_object,6);
/////////////////////////////////////////////////////////////////////////////////
if ( !img_object.data)
return nullptr;
//获得目录,保存文件
cv : :imwrite( "c:/Method2.jpg",img_object);
return "c:/Method2.jpg";
}
二、Winform调用接口部分(TIP:不仅可以用Winform调用,asp.net/webservice都是可以调用的) 1、直接引用clr dll 2、编写helper文件(应该也可以叫做 warpper),通过外部IO的方法获取clr dll的文件 class GOCsharpHelper
{
Class1 clIEnt = new Class1();
string strResult1 = null;
string strResult2 = null;
//输入参数是string或bitmap
public Bitmap ImageProcess(string ImagePath){
Image ImageTemp = Bitmap.Fromfile(ImagePath);
return ImageProcess(ImageTemp);
}
//输出结果是bitmap
public Bitmap ImageProcess(Image image)
{
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
strResult1 = clIEnt.Method(bytes);
Image ImageResult = Bitmap.Fromfile(strResult1);
return (Bitmap)ImageResult;
}
public Bitmap ImageProcess2(string ImagePath)
{
Image ImageTemp = Bitmap.Fromfile(ImagePath);
return ImageProcess2(ImageTemp);
}
//输出结果是bitmap
public Bitmap ImageProcess2(Image image)
{
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
strResult2 = clIEnt.Method2(bytes);
Image ImageResult = Bitmap.Fromfile(strResult2);
return (Bitmap)ImageResult;
}
public voID Clear()
{
if (file.Exists(strResult1))
file.Delete(strResult1);
if (file.Exists(strResult2))
file.Delete(strResult2);
}
}
3、使用例子(注意控件的dispose): private voID button2_Click(object sender, EventArgs e)
{
if (pictureBox1.Image != null)
pictureBox1.Image.dispose();
if (pictureBox2.Image != null)
pictureBox2.Image.dispose();
Image image1 = gocsharphelper.ImageProcess( " E:/sandBox/logo.jpg");
pictureBox1.Image = image1;
Image image2 = gocsharphelper.ImageProcess2( "E:/sandBox/lena.jpg");
pictureBox2.Image = image2;
}
三、解释说明 使用外部I/O不仅仅是权宜之计,实际上Opencv的Decode使用的就是外部I/O。就目前研究的水平来说,这是最稳定的。 目前搭建成功的框架已经能够完成“csharp调用opencv的”目标,并且在调试、参数传递方面都很强。 如果是处理静态图片,已经够用。 四、杀手程序 GOImageResearch: 使用这种方法编写的图像处理预分析程序。 五 、程序调试 在使用这个框架的过程中,有网友反馈 “ clr怎么调试啊,在clr工程中相关的数据全是无效的,怎么看呢,不能保证写的图像算法完全正确啊…… ” 那么clr肯定是可以调试,出现这个问题的原因是没有掌握相关调试技巧。这里是相关解决方法:
2019年8月30日22:50:18 更新 主要是添加了OpenCVDNN模块,将代码升级到2017版本,并解决细节问题,现在应该说处理静态图片,那是相当好的了。 d
来自为知笔记(Wiz)
附件列表 总结
以上是内存溢出为你收集整理的【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍全部内容,希望文章能够帮你解决【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)