Day 10 - C# 与 C++ opencv图像数据转换
-
-
- 一、主要实现功能
- 二、通过C#传入路径,然后通过c++ opencv进行读取,并在C# winform窗口显示图像
- 三、C# 图像数据传入C++,转换成opencv 可以处理的形式
- 参考文章
一、主要实现功能
- 通过C#传入路径,然后通过c++ opencv进行读取,并在C# winform窗口显示图像
- C# 图像数据传入C++,转换成opencv 可以处理的形式
二、通过C#传入路径,然后通过c++ opencv进行读取,并在C# winform窗口显示图像
- c++ 的代码要编译成c#可调用的形式,需要在相应的.h文件中加入以下语句:
#pragma once
#define DLL_API extern "C" _declspec(dllexport)
- 然后在定义的函数前面加上“DLL_API”即可,记得编译时.exe要修改为.dl,最后将编译成功的dll文件放入c#项目的根目录下
DLL_API void GetMat(char* filename, uchar* data, size_t& size)
- 先定义一个GetMat函数,可以通过文件路径读取图像,先通过opencv进行读取,然后转换成C#可以接受的形式
DLL_API void GetMat(char* filename, uchar* data, size_t& size)
{
std::vector<uchar> buffer;
cv::Mat img = cv::imread(filename);
cv::Mat imggray;
cv::cvtColor(img, imggray, cv::COLOR_RGB2GRAY);
cv::imencode(".bmp", imggray, buffer);
size = buffer.size();
for (uchar& var : buffer)
{
*data = var;
data++;
}
}
- 在C# 中导入相应函数
public partial class Form1 : Form
{
[DllImport("C++ToCSharpDll.dll")]
public extern static void GetMat(string filename, ref byte data, out ulong size);
- 然后再winform的某个按钮事件中写入以下内容
private void button2_Click(object sender, EventArgs e)
{
string filename = "4.jpg";
byte[] ptrData = new byte[1920 * 1080 * 3];
ulong size = new ulong();
GetMat(filename, ref ptrData[0], out size);
pictureBox1.Image = Image.FromStream(new MemoryStream(ptrData, 0, (int)size));
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}
- 运行结果如下
三、C# 图像数据传入C++,转换成opencv 可以处理的形式
- 首先在c++ 中定义一个函数
DLL_API void IntPtrToMat(unsigned char* data, int height, int width, int stride)
{
cv::Mat img;
if (stride / width == 3) img = cv::Mat(height, width, CV_8UC3, data, 0);
if (stride / width == 1) img = cv::Mat(height, width, CV_8UC1, data, 0);
if (stride / width == 4) img = cv::Mat(height, width, CV_8UC4, data, 0);
cv::imshow("image", img);
cv::waitKey(0);
}
- 在C#中导入该函数
[DllImport("C++ToCSharpDll.dll")]
public extern static void IntPtrToMat(IntPtr byte1, int width, int height, int stride);
- 在winform的一个按钮事件中添加如下内容
private void button3_Click(object sender, EventArgs e)
{
Bitmap bmp = (Bitmap)Bitmap.FromFile("4.jpg");
BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
int length = bmp.Width * bmp.Height * (bmpdata.Stride / bmp.Width);
byte[] buffer = new byte[length];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, buffer, 0, length);
IntPtrToMat(ptr, bmp.Height, bmp.Width, bmpdata.Stride);
bmp.UnlockBits(bmpdata);
}
5.运行结果
参考文章
- https://blog.csdn.net/qq_24003917/article/details/107425216
- https://blog.csdn.net/a19990412/article/details/78164243
- https://blog.csdn.net/mengsuifengc/article/details/109228725
- https://blog.csdn.net/zhizhengguan/article/details/106013828
- https://blog.csdn.net/zhoumoon/article/details/112681354
- https://blog.csdn.net/rome12/article/details/90025439