witiai 发表于 2021-11-22 22:51:15

C++调用WITIAI模型

C++调用WITIAI模型:
(1)WITIAI软件训练好AI模型后,采用C++调用AI模型,得到分割分类图。
(2)halcon、opencv的接口都预留了,满足工业需求;
(3)Demo代码如下:
// CplusDemos.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <torch/script.h>
#include <torch/utils.h>
#include <iostream>
#include <string>
#include <time.h>
#include <vector>
#include <memory.h>
#include <windows.h>
#include <atlstr.h>
#include <initguid.h>
#include <setupapi.h>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

typedef void(*pload_module)(char* module_path, int GPUindex);
typedef void(*pPredictRGBImage)(char* input_image_path, char* output_image_path, int sliceImageSize, double overRate, double image_threshold, int classnum, int GPUindex);
typedef unsigned char*(*pPredictRGBImagePath2Intptr)(char* input_image_path, int sliceImageSize, double overRate, double image_threshold, int classnum, int GPUindex);
typedef unsigned char*(*pPredictRGBImageMat2Intptr)(int aWidth, int aHeight, int aChannel, unsigned char* aBytes, int sliceImageSize, double overRate, double image_threshold, int classnum, int GPUindex);
typedef void(*pPredictRGBImageMat2Path)(int aWidth, int aHeight, int aChannel, unsigned char* aBytes, char* output_image_path, int sliceImageSize, double overRate, double image_threshold, int classnum, int GPUindex);

typedef void(*pPredictGrayImage)(char* input_image_path, char* output_image_path, int sliceImageSize, double overRate, double image_threshold, int classnum, int GPUindex);
typedef unsigned char*(*pPredictGrayImagePath2Intptr)(char* input_image_path, int sliceImageSize, double overRate, double image_threshold, int classnum, int GPUindex);
typedef unsigned char*(*pPredictGrayImageMat2Intptr)(int aWidth, int aHeight, int aChannel, unsigned char* aBytes, int sliceImageSize, double overRate, double image_threshold, int classnum, int GPUindex);
typedef void(*pPredictGrayImageMat2Path)(int aWidth, int aHeight, int aChannel, unsigned char* aBytes, char* output_image_path, int sliceImageSize, double overRate, double image_threshold, int classnum, int GPUindex);


void fun1()
{
      HINSTANCE HDLL = LoadLibrary("PytorchApi.dll");//加载动态链接库MyDll.dll文件;
      if (HDLL != NULL)
      {
                ///////////////////////// RGB /////////////////////////////////////
                //
                char* model_path = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_model.WITIAI";
                //char* input_image_path = "D:/Release/rgb.jpg";
                char* input_image_path = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb.jpg";
                char* output_image_path = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_1.png";
                int sliceImageSize = 256;
                double overRate = 0;
                double image_threshold = 0.5;
                int classnum = 4;
                int GPUindex = 0;
                // Load model
                const char* FunctionName0 = "load_module";
                pload_module Callload_module = (pload_module)GetProcAddress(HDLL, FunctionName0);
                (*Callload_module)(model_path, GPUindex);

                // method1
                const char* FunctionName1 = "PredictRGBImage";
                pPredictRGBImage CallPredictRGBImage = (pPredictRGBImage)GetProcAddress(HDLL, FunctionName1);
                (*CallPredictRGBImage)(input_image_path, output_image_path, sliceImageSize, overRate, image_threshold, classnum, GPUindex);

                // method2
                Mat image = cv::imread(input_image_path, 1);// RGB
                int aHeight = image.rows;
                int aWidth = image.cols;
                int aChannel = image.channels();
                const char* FunctionName2 = "PredictRGBImagePath2Intptr";
                pPredictRGBImagePath2Intptr CallPredictRGBImagePath2Intptr = (pPredictRGBImagePath2Intptr)GetProcAddress(HDLL, FunctionName2);
                unsigned char* aBytes = new unsigned char;
                aBytes = (*CallPredictRGBImagePath2Intptr)(input_image_path, sliceImageSize, overRate, image_threshold, classnum, GPUindex);
                Mat frame(aHeight, aWidth, CV_MAKETYPE(CV_8U, 1), aBytes);
                cv::imwrite("D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_2.png", frame);

                // method3
                Mat image3 = cv::imread(input_image_path, 1);// RGB
                int aHeight3 = image3.rows;
                int aWidth3 = image3.cols;
                int aChannel3 = image3.channels();
                unsigned char* ucImg3 = new unsigned char;
                std::memcpy(ucImg3, image3.data, aHeight3 * aWidth3 * aChannel3 * sizeof(unsigned char));
                const char* FunctionName3 = "PredictRGBImageMat2Intptr";
                pPredictRGBImageMat2Intptr CallPredictRGBImageMat2Intptr = (pPredictRGBImageMat2Intptr)GetProcAddress(HDLL, FunctionName3);
                unsigned char* aBytes1 = new unsigned char;
                aBytes1 = (*CallPredictRGBImageMat2Intptr)(aWidth3, aHeight3, aChannel3, ucImg3, sliceImageSize, overRate, image_threshold, classnum, GPUindex);
                Mat frame1(aHeight3, aWidth3, CV_MAKETYPE(CV_8U, 1), aBytes1);
                cv::imwrite("D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_3.png", frame1);


                // method4
                Mat image4 = cv::imread(input_image_path, 1);// RGB
                int aHeight4 = image4.rows;
                int aWidth4 = image4.cols;
                int aChannel4 = image4.channels();
                unsigned char* ucImg4 = new unsigned char;
                std::memcpy(ucImg4, image4.data, aHeight4 * aWidth4 * aChannel4 * sizeof(unsigned char));
                const char* FunctionName4 = "PredictRGBImageMat2Path";
                pPredictRGBImageMat2Path CallPredictRGBImageMat2Path = (pPredictRGBImageMat2Path)GetProcAddress(HDLL, FunctionName4);
                char* output_image_path4 = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_4.png";
                (*CallPredictRGBImageMat2Path)(aWidth4, aHeight4, aChannel4, ucImg4, output_image_path4, sliceImageSize, overRate, image_threshold, classnum, GPUindex);
                //
                ///////////////////////// RGB /////////////////////////////////////
                //
                //
                ///////////////////////// Gray /////////////////////////////////////
                //
                char* model_path0 = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_model.WITIAI";
                char* input_image_path0 = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray.jpg";
                char* output_image_path0 = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_1.png";
                int sliceImageSize0 = 512;
                //double overRate = 0;
                //double image_threshold = 0.5;
                //int classnum = 4;
                //int GPUindex = 0;
                // Load model
                const char* FunctionName5 = "load_module";
                pload_module Callload_module_gray = (pload_module)GetProcAddress(HDLL, FunctionName5);
                (*Callload_module_gray)(model_path0, GPUindex);

                // method1
                const char* FunctionName6 = "PredictGrayImage";
                pPredictGrayImage CallPredictGrayImage = (pPredictGrayImage)GetProcAddress(HDLL, FunctionName6);
                (*CallPredictGrayImage)(input_image_path0, output_image_path0, sliceImageSize0, overRate, image_threshold, classnum, GPUindex);

                // method2
                Mat image_gray = cv::imread(input_image_path0, 0);// Gray
                int aHeight_gray = image_gray.rows;
                int aWidth_gray = image_gray.cols;
                int aChannel_gray = image_gray.channels();
                const char* FunctionName7 = "PredictGrayImagePath2Intptr";
                pPredictGrayImagePath2Intptr CallPredictGrayImagePath2Intptr = (pPredictGrayImagePath2Intptr)GetProcAddress(HDLL, FunctionName7);
                unsigned char* aBytes_gray = new unsigned char;
                aBytes_gray = (*CallPredictRGBImagePath2Intptr)(input_image_path0, sliceImageSize0, overRate, image_threshold, classnum, GPUindex);
                Mat frame_gray(aHeight_gray, aWidth_gray, CV_MAKETYPE(CV_8U, 1), aBytes_gray);
                cv::imwrite("D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_2.png", frame_gray);

                // method3
                Mat image3_gray = cv::imread(input_image_path0, 0);// Gray
                int aHeight3_gray = image3_gray.rows;
                int aWidth3_gray = image3_gray.cols;
                int aChannel3_gray = image3_gray.channels();
                unsigned char* ucImg3_gray = new unsigned char;
                std::memcpy(ucImg3_gray, image3_gray.data, aHeight3_gray * aWidth3_gray * aChannel3_gray * sizeof(unsigned char));
                const char* FunctionName8 = "PredictGrayImageMat2Intptr";
                pPredictGrayImageMat2Intptr CallPredictGrayImageMat2Intptr = (pPredictGrayImageMat2Intptr)GetProcAddress(HDLL, FunctionName8);
                unsigned char* aBytes1_gray = new unsigned char;
                aBytes1_gray = (*CallPredictGrayImageMat2Intptr)(aWidth3_gray, aHeight3_gray, aChannel3_gray, ucImg3_gray, sliceImageSize0, overRate, image_threshold, classnum, GPUindex);
                Mat frame1_gray(aHeight3_gray, aWidth3_gray, CV_MAKETYPE(CV_8U, 1), aBytes1_gray);
                cv::imwrite("D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_3.png", frame1_gray);

                // method4
                Mat image4_gray = cv::imread(input_image_path0, 0);// Gray
                int aHeight4_gray = image4_gray.rows;
                int aWidth4_gray = image4_gray.cols;
                int aChannel4_gray = image4_gray.channels();
                unsigned char* ucImg4_gray = new unsigned char;
                std::memcpy(ucImg4_gray, image4_gray.data, aHeight4_gray * aWidth4_gray * aChannel4_gray * sizeof(unsigned char));
                const char* FunctionName9 = "PredictGrayImageMat2Path";
                pPredictGrayImageMat2Path CallPredictGrayImageMat2Path = (pPredictGrayImageMat2Path)GetProcAddress(HDLL, FunctionName9);
                char* output_image_path4_gray = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_4.png";
                (*CallPredictGrayImageMat2Path)(aWidth4_gray, aHeight4_gray, aChannel4_gray, ucImg4_gray, output_image_path4_gray, sliceImageSize0, overRate, image_threshold, classnum, GPUindex);
                //
                ///////////////////////// Gray /////////////////////////////////////


                //try
                //{
                //      FreeLibrary(HDLL);   //卸载MyDll.dll文件;
                //}
                //catch(exception ex)
                //{
                //      std::cout << "catch(FreeLibrary(HDLL))\n";
                //}
      }

}

void fun2()
{
      HINSTANCE HDLL = LoadLibrary("PytorchApi1.dll");//加载动态链接库MyDll.dll文件;
      if (HDLL != NULL)
      {
                ///////////////////////// RGB /////////////////////////////////////
                //
                char* model_path = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_model.WITIAI";
                //char* input_image_path = "D:/Release/rgb.jpg";
                char* input_image_path = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb.jpg";
                char* output_image_path = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_1.png";
                int sliceImageSize = 256;
                double overRate = 0;
                double image_threshold = 0.5;
                int classnum = 4;
                int GPUindex = 0;
                // Load model
                const char* FunctionName0 = "load_module";
                pload_module Callload_module = (pload_module)GetProcAddress(HDLL, FunctionName0);
                (*Callload_module)(model_path, GPUindex);

                // method1
                const char* FunctionName1 = "PredictRGBImage";
                pPredictRGBImage CallPredictRGBImage = (pPredictRGBImage)GetProcAddress(HDLL, FunctionName1);
                (*CallPredictRGBImage)(input_image_path, output_image_path, sliceImageSize, overRate, image_threshold, classnum, GPUindex);

                // method2
                Mat image = cv::imread(input_image_path, 1);// RGB
                int aHeight = image.rows;
                int aWidth = image.cols;
                int aChannel = image.channels();
                const char* FunctionName2 = "PredictRGBImagePath2Intptr";
                pPredictRGBImagePath2Intptr CallPredictRGBImagePath2Intptr = (pPredictRGBImagePath2Intptr)GetProcAddress(HDLL, FunctionName2);
                unsigned char* aBytes = new unsigned char;
                aBytes = (*CallPredictRGBImagePath2Intptr)(input_image_path, sliceImageSize, overRate, image_threshold, classnum, GPUindex);
                Mat frame(aHeight, aWidth, CV_MAKETYPE(CV_8U, 1), aBytes);
                cv::imwrite("D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_2.png", frame);

                // method3
                Mat image3 = cv::imread(input_image_path, 1);// RGB
                int aHeight3 = image3.rows;
                int aWidth3 = image3.cols;
                int aChannel3 = image3.channels();
                unsigned char* ucImg3 = new unsigned char;
                std::memcpy(ucImg3, image3.data, aHeight3 * aWidth3 * aChannel3 * sizeof(unsigned char));
                const char* FunctionName3 = "PredictRGBImageMat2Intptr";
                pPredictRGBImageMat2Intptr CallPredictRGBImageMat2Intptr = (pPredictRGBImageMat2Intptr)GetProcAddress(HDLL, FunctionName3);
                unsigned char* aBytes1 = new unsigned char;
                aBytes1 = (*CallPredictRGBImageMat2Intptr)(aWidth3, aHeight3, aChannel3, ucImg3, sliceImageSize, overRate, image_threshold, classnum, GPUindex);
                Mat frame1(aHeight3, aWidth3, CV_MAKETYPE(CV_8U, 1), aBytes1);
                cv::imwrite("D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_3.png", frame1);


                // method4
                Mat image4 = cv::imread(input_image_path, 1);// RGB
                int aHeight4 = image4.rows;
                int aWidth4 = image4.cols;
                int aChannel4 = image4.channels();
                unsigned char* ucImg4 = new unsigned char;
                std::memcpy(ucImg4, image4.data, aHeight4 * aWidth4 * aChannel4 * sizeof(unsigned char));
                const char* FunctionName4 = "PredictRGBImageMat2Path";
                pPredictRGBImageMat2Path CallPredictRGBImageMat2Path = (pPredictRGBImageMat2Path)GetProcAddress(HDLL, FunctionName4);
                char* output_image_path4 = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/rgb_4.png";
                (*CallPredictRGBImageMat2Path)(aWidth4, aHeight4, aChannel4, ucImg4, output_image_path4, sliceImageSize, overRate, image_threshold, classnum, GPUindex);
                //
                ///////////////////////// RGB /////////////////////////////////////
                //
                //
                ///////////////////////// Gray /////////////////////////////////////
                //
                char* model_path0 = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_model.WITIAI";
                char* input_image_path0 = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray.jpg";
                char* output_image_path0 = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_1.png";
                int sliceImageSize0 = 512;
                //double overRate = 0;
                //double image_threshold = 0.5;
                //int classnum = 4;
                //int GPUindex = 0;
                // Load model
                const char* FunctionName5 = "load_module";
                pload_module Callload_module_gray = (pload_module)GetProcAddress(HDLL, FunctionName5);
                (*Callload_module_gray)(model_path0, GPUindex);

                // method1
                const char* FunctionName6 = "PredictGrayImage";
                pPredictGrayImage CallPredictGrayImage = (pPredictGrayImage)GetProcAddress(HDLL, FunctionName6);
                (*CallPredictGrayImage)(input_image_path0, output_image_path0, sliceImageSize0, overRate, image_threshold, classnum, GPUindex);

                // method2
                Mat image_gray = cv::imread(input_image_path0, 0);// Gray
                int aHeight_gray = image_gray.rows;
                int aWidth_gray = image_gray.cols;
                int aChannel_gray = image_gray.channels();
                const char* FunctionName7 = "PredictGrayImagePath2Intptr";
                pPredictGrayImagePath2Intptr CallPredictGrayImagePath2Intptr = (pPredictGrayImagePath2Intptr)GetProcAddress(HDLL, FunctionName7);
                unsigned char* aBytes_gray = new unsigned char;
                aBytes_gray = (*CallPredictRGBImagePath2Intptr)(input_image_path0, sliceImageSize0, overRate, image_threshold, classnum, GPUindex);
                Mat frame_gray(aHeight_gray, aWidth_gray, CV_MAKETYPE(CV_8U, 1), aBytes_gray);
                cv::imwrite("D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_2.png", frame_gray);

                // method3
                Mat image3_gray = cv::imread(input_image_path0, 0);// Gray
                int aHeight3_gray = image3_gray.rows;
                int aWidth3_gray = image3_gray.cols;
                int aChannel3_gray = image3_gray.channels();
                unsigned char* ucImg3_gray = new unsigned char;
                std::memcpy(ucImg3_gray, image3_gray.data, aHeight3_gray * aWidth3_gray * aChannel3_gray * sizeof(unsigned char));
                const char* FunctionName8 = "PredictGrayImageMat2Intptr";
                pPredictGrayImageMat2Intptr CallPredictGrayImageMat2Intptr = (pPredictGrayImageMat2Intptr)GetProcAddress(HDLL, FunctionName8);
                unsigned char* aBytes1_gray = new unsigned char;
                aBytes1_gray = (*CallPredictGrayImageMat2Intptr)(aWidth3_gray, aHeight3_gray, aChannel3_gray, ucImg3_gray, sliceImageSize0, overRate, image_threshold, classnum, GPUindex);
                Mat frame1_gray(aHeight3_gray, aWidth3_gray, CV_MAKETYPE(CV_8U, 1), aBytes1_gray);
                cv::imwrite("D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_3.png", frame1_gray);

                // method4
                Mat image4_gray = cv::imread(input_image_path0, 0);// Gray
                int aHeight4_gray = image4_gray.rows;
                int aWidth4_gray = image4_gray.cols;
                int aChannel4_gray = image4_gray.channels();
                unsigned char* ucImg4_gray = new unsigned char;
                std::memcpy(ucImg4_gray, image4_gray.data, aHeight4_gray * aWidth4_gray * aChannel4_gray * sizeof(unsigned char));
                const char* FunctionName9 = "PredictGrayImageMat2Path";
                pPredictGrayImageMat2Path CallPredictGrayImageMat2Path = (pPredictGrayImageMat2Path)GetProcAddress(HDLL, FunctionName9);
                char* output_image_path4_gray = "D:/2-LearningCode/994-WiTiAi/5_Demos/CplusDemos/CplusDemos/x64/Release/gray_4.png";
                (*CallPredictGrayImageMat2Path)(aWidth4_gray, aHeight4_gray, aChannel4_gray, ucImg4_gray, output_image_path4_gray, sliceImageSize0, overRate, image_threshold, classnum, GPUindex);
                //
                ///////////////////////// Gray /////////////////////////////////////


                //try
                //{
                //      FreeLibrary(HDLL);   //卸载MyDll.dll文件;
                //}
                //catch(exception ex)
                //{
                //      std::cout << "catch(FreeLibrary(HDLL))\n";
                //}
      }

}

int main()
{
      std::cout << "Hello World!\n";
      // 注释:当有2个AI模型参与调度时, PytorchApi.dll,加载第一个模型,PytorchApi1.dll,加载第二个模型

      fun1();

      //fun2();

      system("pause");
      return 0;
}








页: [1]
查看完整版本: C++调用WITIAI模型