一些废话:

        这个学期的openCV大作业要求使用QT或者winform做成一个界面,但是实现代码需要使用cpp,使用QT固然方便,但是需要下载QT,但是电脑有点问题,C盘天天蹦迪不太敢下新软件(软件都在D盘里,D盘也不太够了),而且……好吧说白了就是懒得下新东西(

        所以就在到处找怎么做,但是人比较菜,找到的要么版本不对看不懂,要么要下新东西,本来就是不想下新东西才使用winform的嘛,就开始求助万能的deepseek,最后发现非常之简单……

        接下来就开始咯~

基础准备:

看看VS里面有没有这些东西……

准备就绪……

打开VS2022,创建一个新项目,语言选择C++,搜索模板 动态链接库(DLL) ,然后取个名字,放在一个文件夹里。

创建好了之后,在解决方案资源管理器中,右键项目,选择添加(D) -> 新建项(W)->选择头文件(.h),然后随便取一个名字,我这取的是openCV_test.h

然后再在新建项里,选择C++文件(cpp),名字要和头文件取名一样

ps:如果打开如果是紧凑视图,就点击显示所有模板(T)

接下来就开始编写动态库程序

头文件代码如下:

#pragma once
#include <opencv2/opencv.hpp>

// 定义导出宏,确保在DLL中正确导出函数
#ifdef OPENCVTEST_EXPORTS
#define OPENCVTEST_API __declspec(dllexport)
#else
#define OPENCVTEST_API __declspec(dllimport)
#endif

extern "C" {
    OPENCVTEST_API void ProcessImage(const char* inputPath, const char* outputPath);
}

接下来在cpp文件中实现函数功能

#include "opencv_test.h"    // 加入刚编写的头文件
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/// <summary>
/// 转化为灰度图
/// </summary>
/// <param name="inputPath">源图路径</param>
/// <param name="outputPath">保存路径</param>
void ProcessImage(const char* inputPath, const char* outputPath) {
    Mat image = cv::imread(inputPath);
    if (image.empty()) return;

    Mat gray;
    cvtColor(image, gray, cv::COLOR_BGR2GRAY);
    imwrite(outputPath, gray);
}

在开始编译之前,我们还需要进行一些操作,打开解决方案资源管理器,右键项目名称 -> 属性 -> C/C++ -> 预编译头,将预编译头更改为不使用预编译头,点击应用 -> 确定。

然后开始生成解决方案:生成-> 生成解决方案。

生成完毕! 找到生成的dll文件,我们之后要用。一般而言,生成好的 DLL 文件会在 项目目录\x64\Debug\ 中。

接下来我们新建 C# 的 Winform 项目

选择语言为 C#,选择Windows 窗体应用(.NET Framework)

随便给项目取个名字,选择保存路径,创建项目。

创建好了以后,打开项目所在文件夹,将之前生成好的 dll 文件复制进 项目目录\bin\Debug\ 中。

接下来,找到自己 OpenCV 的库文件,找到 opencv_world454.dll(我的OpenCV是4.5.4版本的,根据自己动态库使用的版本为准),将其复制进刚刚的文件夹中。

一般opencv_world454.dll 会在 opencv-4.5.4\opencv\build\x64\vc15\bin\ 中。

文件夹内容如下所示。

然后开始设计界面啦,在窗体上添加一个Button控件,我就使用默认控件名称 buttom1 了,双击按钮进入代码界面。

在 C# 中,通过 DllImport 声明 C++ 函数,之后就可以使用在cpp文件中的函数啦。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace openCVApp
{
    public partial class Form1: Form
    {
        // 引用 DLL 文件
        [DllImport("test_dll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void ProcessImage(string inputPath, string outputPath);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 以下路径改为自己的源图路径和保存路径
            string inputPath = @"D:\Homework\resources\book_images\baboon.jpg";
            string outputPath = @"D:\Homework\save\";

            try
            {
                ProcessImage(inputPath, outputPath);
                MessageBox.Show("图像处理完成!");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"错误:{ex.Message}");
            }
        }
    }
}

点击运行,点击button1。欸,有问题……

对了,之前的 DLL 文件是 x64 平台生成的,我们需要把 C# 生成平台要保持一致,也改为 x64。

右键项目 -> 属性 -> 生成 -> 目标平台,更改为 x64。

保存,再次运行...

报错显示外部组件发生异常。(思考.jpg)

哦对了,输出路径那里忘记写保存文件名了,改一下

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace openCVApp
{
    public partial class Form1: Form
    {
        // 引用 DLL 文件
        [DllImport("test_dll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void ProcessImage(string inputPath, string outputPath);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 以下路径改为自己的源图路径和保存路径
            string inputPath = @"D:\Homework\resources\book_images\baboon.jpg";
            string outputPath = @"D:\Homework\save\mysave.jpg"; // 加了保存名

            try
            {
                ProcessImage(inputPath, outputPath);
                MessageBox.Show("图像处理完成!");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"错误:{ex.Message}");
            }
        }
    }
}

运行,显示图像处理完成。

让我们看看有没有保存在指定路径下

保存成功✔

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐