对象在预加载脚本中传递给函数后丢失其类型

Posted

技术标签:

【中文标题】对象在预加载脚本中传递给函数后丢失其类型【英文标题】:Object losing it's type after passing to function in preloaded script 【发布时间】:2022-01-14 03:56:10 【问题描述】:

我有一个小型桌面应用程序,它显示来自相机的视频源,拍摄照片并将其传递到神经网络。

当我拍摄图像时,它的类型是Tensor,正如预期的那样,但是在将它传递给一个负责分类的函数后,它失去了它的类型并变成了一个简单的对象。

结构如下:

CameraSource <video> 元素内显示视频,并调用函数

ImageRecognizer @tensorflow/tfjs-node,并预加载到窗口中

现在代码如下:

CameraSource.vue

async test() 
      let vid: htmlVideoElement = this.$refs.camera_preview as HTMLVideoElement;
      const img = tf.browser.fromPixels(vid);
      console.log(img); <- here it's a Tensor
      await window.api.test(img);
    

image_recognition.ts

public async checkForObject(image: tf.Tensor): Promise<tf.Tensor<tf.Rank> | tf.Tensor<tf.Rank>[]> 
        console.log(image); <- here it lose's it's Tensor type, and becomes an object
        let reshaped = image.reshape([-1,720,1280,1]); <- this won't work, since image is not a Tensor
        return this.model.predict(image);
   

preload.ts

const imageRecognizer = new ImageRecognition(720, 1280, 3);

contextBridge.exposeInMainWorld("api", 
    test: (image: tf.Tensor): Promise<tf.Tensor<tf.Rank> | tf.Tensor<tf.Rank>[]> => 
        return imageRecognizer.checkForObject(image)
    
);

类型声明

declare global 
    interface Window 
        api: 
            test: (image: tf.Tensor) => Promise<tf.Tensor<tf.Rank> | tf.Tensor<tf.Rank>[]>
        
    

这是因为我试图将对象传递到电子应用程序的“后端”吗?有什么办法可以预防吗?

Tensor losing it's type

【问题讨论】:

【参考方案1】:

好的,我应该更仔细地阅读文档。

ContextBridge 复制值,因此它只能处理某些类型。要使用复杂类型,例如Tensor3D,建议分别对值进行序列化和反序列化。

这里说的都是:Electron contextBridge documentation

【讨论】:

以上是关于对象在预加载脚本中传递给函数后丢失其类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的非静态游戏对象在场景重新加载后会在脚本中丢失其引用?

如何在预加载的数据库中填充 ListView

如何在预编译期间包含自定义 SASS 函数?

[画布仅在预加载图像时出现CORS问题

什么类型的数据可以在预编译的 C++ 和 Java for Android 之间传递?

在预加载新闻时,怎么去掉初始化内容的显示尴尬?