【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8351字,纯文字阅读大概需要12分钟。
内容图文
![【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍](/upload/InfoBanner/zyjiaocheng/724/767103c3355a4a38ad9883cf92c31ca1.jpg)
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,1,CV_8U,pby1);
?????cv::Mat?img_object?=?cv::imdecode(img_data1,IMREAD_UNCHANGED);
?????//////////////////////////////////处理过程/////////
?????cvtColor(img_object,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,1,CV_8U,pby1);
????cv::Mat?img_object?=?cv::imdecode(img_data1,IMREAD_UNCHANGED);
????//////////////////////////////////处理过程///////////////////////
????cvtColor(img_object,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![【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍 - 文章图片](/upload/getfiles/0001/2021/5/3/20210503071358123.jpg)
?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:使用这种方法编写的图像处理预分析程序。
![【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍 - 文章图片](/upload/getfiles/0001/2021/5/3/20210503071358616.jpg)
![【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍 - 文章图片](/upload/getfiles/0001/2021/5/3/20210503071359615.jpg)
![【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍 - 文章图片](/upload/getfiles/0001/2021/5/3/20210503071400283.jpg)
![【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍 - 文章图片](/upload/getfiles/0001/2021/5/3/20210503071401126.jpg)
2019年8月30日22:50:18 更新主要是添加了OpenCVDNN模块,将代码升级到2017版本,并解决细节问题,现在应该说处理静态图片,那是相当好的了。
![【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍 - 文章图片](/upload/getfiles/0001/2021/5/3/20210503071401723.jpg)
来自为知笔记(Wiz)
附件列表
内容总结
以上是互联网集市为您收集整理的【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍全部内容,希望文章能够帮你解决【4opencv】为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。