How to save asset in C++ runtime(play in game)?

UCLASS(BlueprintType)
class VECTORIZINGANIMATION_API UcvMat : public UObject
{
GENERATED_BODY()
public:

	UcvMat(){}

	UcvMat(cv::Mat mat) : pic(mat){}

	operator cv::Mat()
	{
		return pic;
	}
	
	cv::Mat pic;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Mat")
	UTexture2D* Texture;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Mat")
	UMaterialInterface* MasterMaterialRef;
};

I Make my class and make his factory

UCLASS()
class VECTORIZINGANIMATION_API UcvMatFactory : public UFactory
{
	GENERATED_UCLASS_BODY()
	
	
	// UFactory interface
	virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
	// End of UFactory interface
	
};


UcvMatFactory::UcvMatFactory(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{
	bCreateNew = true;
	bEditAfterNew = true;
	SupportedClass = UcvMat::StaticClass();
}

UObject* UcvMatFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
{
	UcvMat* NewObjectAsset = ConstructObject<UcvMat>(Class, InParent, Name, Flags | RF_Transactional);
	return NewObjectAsset;
}

then dynamic loading UTexture2D asset and I want to make UcvMat asset

TArray<UcvMat*> ADataGetterActor::GetWorkCVMat(FString path)
{
    TArray<UcvMat*> res;
    TArray<UObject*> TextureAssets;
    EngineUtils::FindOrLoadAssetsByPath(path, TextureAssets, EngineUtils::ATL_Regular);
    for(int32 i = 0; i < TextureAssets.Num(); ++i)
    {
        UTexture2D* tex = Cast<UTexture2D>(TextureAssets[i]);
        if(tex != nullptr)
        {
			FString name;
			tex->GetName(name);
            FString PackageName = TEXT("/Game/test/");
            PackageName += name;
            UPackage* Package = CreatePackage(NULL, *PackageName);

			UcvMat* NewAsset = NewNamedObject<UcvMat>(Package, FName("CvMat"), RF_Public);
            if(NewAsset != NULL)
            {
                // Fill in the assets data here
                //UcvMat* tmp = NewObject<UcvMat>();
				UcvMat* tmp = NewAsset;
                name = TEXT("cvMat_") + name;
                tmp->Rename(*name);
                tmp->Texture = tex;
                tmp->UpdateTextureToCvMat();
                res.Add(tmp);
				FAssetRegistryModule::AssetCreated(NewAsset);
				NewAsset->MarkPackageDirty();
				NewAsset->PostEditChange();
				Package->SetDirtyFlag(true);
				FString PackageFileName = FPackageName::LongPackageNameToFilename(PackageName, FPackageName::GetAssetPackageExtension());
				UPackage::SavePackage(Package, NewAsset, RF_Public, *PackageFileName, GError, nullptr, true, true, SAVE_NoError);
				
            }
        }
    }
    return res;
}

It save but always only 1kb.
and it save fail.
but when I use editor create cvMat asset and save.
Then it fine, so how could I save asset which created in runtime?

Ok, I know only foundation data type can be save.