• UE4笔记-15版本 Plugins引用OpenCV


    记录个旧版本的Build.cs备查 

    Note:在4.20版本中已经有个官方的Plugins集成了OpenCV :OpenCVLensDistortion 需要用的话自己引用就可以(记得是3.X的版本,想用最新的4.X自己撸个第三方插件吧)

    现在的版本(4.20)Build.cs已经变化很多了。

    因为已经存在官方的demo(Editor添加插件的时候,有第三方插件选项),就不贴新的build.cs了

    整体来说就是多了个插件的module,第三方DLL或.SO/.a必须放在Module里,挺奇葩的,

    4.15的引用第三方OpenCV的plugin 的build.cs:

    /*
    
    */
    
    using System;
    using System.IO;
    using System.Collections.Generic;
    using UnrealBuildTool;
    
    public class LQCVPlug: ModuleRules
    {
    
        protected string PluginRootDirectory
        {
            get { return Path.GetFullPath(Path.Combine(ModuleDirectory, "../../")); }
        }
    
        protected string ThirdPartyPath
        {
            get { return Path.Combine(PluginRootDirectory, "ThirdParty/"); }
        }
    
        protected string BinariesDir
        {
            get { return Path.Combine(PluginRootDirectory, "Binaries"); }
        }
    
        protected List<string> OpenCVModules = new List<string>()
        {
            "opencv_core",
            "opencv_calib3d",    // camera calibration
            "opencv_features2d", // cv::SimpleBlobDetector for calibration
            "opencv_videoio",    // VideoCapture
            "opencv_aruco",        // Aruco markers
            "opencv_imgproc",   // Aruco needs this
            "opencv_flann",     // Aruco needs this
            "opencv_imgcodecs",    // imwrite
            "opencv_video"        // Kalman filter, suprisingly it is in modules/video/...
        };
    
        protected string OpenCVVersion = "310";
    
        protected string PlatformString(TargetInfo Target)
        {
            if (Target.Platform == UnrealTargetPlatform.Win64) { return "Win64"; }
            if (Target.Platform == UnrealTargetPlatform.Win32) { return "Win32"; }
            if (Target.Platform == UnrealTargetPlatform.Linux) { return "Linux"; }
            if (Target.Platform == UnrealTargetPlatform.Android) { return "Android"; }
            return "Unknown";
        }
    
        protected string BinariesDirForTarget(TargetInfo Target)
        {
            return Path.Combine(BinariesDir, PlatformString(Target));
        }
    
        public bool IsDebug(TargetInfo Target)
        {
            return Target.Configuration == UnrealTargetConfiguration.Debug && BuildConfiguration.bDebugBuildsActuallyUseDebugCRT;
        }
    
        public void LoadOpenCV(TargetInfo Target)
        {
            string opencv_dir = Path.Combine(ThirdPartyPath, "opencv");
    
            PublicIncludePaths.Add(Path.Combine(opencv_dir, "include"));
    
            if (Target.Platform == UnrealTargetPlatform.Win64)
            {
                Console.WriteLine("AUR: OpenCV for Win64");
    
                var suffix = OpenCVVersion;
    
                if (IsDebug(Target))
                {
                    Console.WriteLine("AUR: Debug");
                    suffix += "d";
                }
                else
                {
                    Console.WriteLine("AUR: Not debug");
                }
    
                var lib_dir = Path.Combine(opencv_dir, "lib", "Win64");
    
                PublicAdditionalLibraries.AddRange
                (
                    OpenCVModules.ConvertAll(m => Path.Combine(lib_dir, m + suffix + ".lib"))
                );
    
                PublicDelayLoadDLLs.AddRange
                (
                    OpenCVModules.ConvertAll(m => Path.Combine(BinariesDirForTarget(Target), m + suffix + ".dll"))
                );
            }
            else if (Target.Platform == UnrealTargetPlatform.Linux)
            {
                Console.WriteLine("AUR: OpenCV for Linux");
    
                var opencv_libs = OpenCVModules.ConvertAll(m => Path.Combine(BinariesDirForTarget(Target), "lib" + m + ".so"));
    
                PublicAdditionalLibraries.AddRange(opencv_libs);
                PublicDelayLoadDLLs.AddRange(opencv_libs);
            }
            else if (Target.Platform == UnrealTargetPlatform.Android)
            {
                Console.WriteLine("AUR: OpenCV for Android");
                Console.WriteLine("AUR: OpenCV for Android with arch = ", Target.Architecture);
    
                var arch = "armeabi-v7a"; //Target.Architecture
    
                var src_dir = Path.Combine(opencv_dir, "install", "Android", "sdk", "native");
                var modules_lib_dir = Path.Combine(src_dir, "libs", arch);
    
                var opencv_libs = OpenCVModules.ConvertAll
                (
                    m => Path.Combine(modules_lib_dir, "lib" + m + ".a")
                );
    
                PublicLibraryPaths.Add(modules_lib_dir);
                PublicAdditionalLibraries.AddRange(opencv_libs);
                /*
                var thirdparty_lib_dir = Path.Combine(src_dir, "3rdparty", "libs", arch);
                var thirdparty_libs = new List<string>(Directory.GetFiles(thirdparty_lib_dir)).ConvertAll
                (
                    fn => Path.Combine(thirdparty_lib_dir, fn)
                );
                PublicLibraryPaths.Add(thirdparty_lib_dir);
                PublicAdditionalLibraries.AddRange(thirdparty_libs);
                */
            }
            else
            {
                Console.WriteLine("AUR: No prebuilt binaries for OpenCV on platform " + Target.Platform);
            }
    
            // Force execption handling across all modules.
            UEBuildConfiguration.bForceEnableExceptions = true;
        }
    
        public LQCVPlug(TargetInfo Target)
        {
            
            PublicIncludePaths.AddRange(
                new string[] {
                    "LQCVPlug/Public"
                    
                    // ... add public include paths required here ...
                }
                );
                    
            
            PrivateIncludePaths.AddRange(
                new string[] {
                    "LQCVPlug/Private",
                    
                    // ... add other private include paths required here ...
                }
                );
    
            PublicDependencyModuleNames.AddRange(
                new string[]
                {
                    "Core",
                    "CoreUObject",
                    "Engine",
                    "Slate",
                    "SlateCore",
                    "Networking",
                    "Sockets",
                    "RenderCore",
                    "RHI",
                    "ImageWrapper",
                    "FreeType2"
                    // ... add private dependencies that you statically link with here ...    
                }
                );
    
            DynamicallyLoadedModuleNames.AddRange(
                new string[]
                {
                    // ... add any modules that your module loads dynamically here ...
                }
                );
    
            LoadOpenCV(Target);
            //LoadFreeType2(Target);
    
    
            Console.WriteLine("Include headers from directories:");
            PublicIncludePaths.ForEach(m => Console.WriteLine("    " + m));
    
            Console.WriteLine("Libraries - static:");
            PublicAdditionalLibraries.ForEach(m => Console.WriteLine("    " + m));
    
            Console.WriteLine("Libraries - dynamic:");
            PublicDelayLoadDLLs.ForEach(m => Console.WriteLine("    " + m));
            
        }
    }
  • 相关阅读:
    Job for docker.service failed because the control process exited with error code. See
    连接数据库出现The server time zone value '�й���׼ʱ��' is unrecogni等问题的解决方案
    【面试】SSH 框架原理
    【面试】Spring 执行流程
    【面试】Redis
    Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.
    分享一个带有合计行功能的DataGridView扩展
    记录一次系统优化
    使用 Cordova(PhoneGap)构建Android程序
    分享一个换肤解决方案
  • 原文地址:https://www.cnblogs.com/linqing/p/9830790.html
Copyright © 2020-2023  润新知