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]