Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有OpenCV未定义符号的Tensorflow自定义op_Python_C++_Opencv_Tensorflow_Compilation - Fatal编程技术网

Python 带有OpenCV未定义符号的Tensorflow自定义op

Python 带有OpenCV未定义符号的Tensorflow自定义op,python,c++,opencv,tensorflow,compilation,Python,C++,Opencv,Tensorflow,Compilation,我正在为Tensorflow编写一个自定义操作,它应该加载一个视频。为此,我需要包括OpenCV 目前,该操作只是尝试打开一个视频捕获,并返回一个空张量 这里是C++代码: #include "opencv2/opencv.hpp" #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "tensorflow/core/framework/op.h" #include "tensorf

我正在为Tensorflow编写一个自定义操作,它应该加载一个视频。为此,我需要包括OpenCV

目前,该操作只是尝试打开一个视频捕获,并返回一个空张量

这里是C++代码:

#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"


#include "tensorflow/core/framework/op.h"
#include "tensorflow/core/framework/shape_inference.h"
#include "tensorflow/core/framework/op_kernel.h"

#include <iostream>

using namespace tensorflow;
using namespace cv;
using namespace std;

using shape_inference::ShapeHandle;
using shape_inference::DimensionHandle;

REGISTER_OP("LoadVideo")
    .Input("filename: string")
    .Output("frame: float32")
    .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) {
        TensorShape outputTensorShape({224, 224, 3});
        ShapeHandle outputShapeHandle;
        c->MakeShapeFromTensorShape(outputTensorShape, &outputShapeHandle);
        c->set_output(0, outputShapeHandle);
        return Status::OK();
    });

class LoadVideoOp : public OpKernel {
 public:
  explicit LoadVideoOp(OpKernelConstruction* context) : OpKernel(context) {}

  void Compute(OpKernelContext* context) override {
    // Grab the input tensor
    const Tensor& input_tensor = context->input(0);
    auto input = input_tensor.flat<string>();
    string filename = input(0);

    VideoCapture cap = VideoCapture("data/0eRkpTGq5pA.mp4");

    Tensor* output_tensor = NULL;
    OP_REQUIRES_OK(context, context->allocate_output(0, {224, 224, 3}, &output_tensor));

  }
};

REGISTER_KERNEL_BUILDER(Name("LoadVideo").Device(DEVICE_CPU), LoadVideoOp);
当我将编译后的代码加载到Python脚本中(使用tf.load_op_library)并尝试运行op时,我得到以下错误:

tensorflow.python.framework.errors\u impl.NotFoundError:lib/ops/load\u video.so:undefined symbol:\u ZN2cv12VideoCaptureC1ERKNSt7\u CXX1112基本\u stringIcSt11char\u TraitSiceee

<>看起来编译的C++代码不能访问适当的OpenCV对象。我对C++编译和链接了解不多,所以问题可能是我错误地编译了自定义的OP。 你能不能帮我把op编译成这样,这样它就可以被tensorflow成功加载和运行

编辑1:

这是我用来加载自定义op的Python脚本:

import tensorflow as tf
load_video_module = tf.load_op_library('lib/ops/load_video.so')
with tf.Session():
  x = load_video_module.load_video("data/0eRkpTGq5pA.mp4").eval()
  print(x)
<> >错误发生在第2行(即尝试加载编译后的C++代码)。

解决方案:

在重建OpenCV之后,我成功地编译并运行了自定义tensorflow op。编译命令是:

g++ -std=c++11 -ggdb -shared -I`python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())'` `pkg-config --cflags opencv` -o load_video.so load_video.cc `pkg-config --libs opencv` -fPIC

如果您在Linux上运行,请将cd刻录到包含视频文件的目录中,然后执行以下操作(不带括号):

sudo chmod 777 (the name of your video file)
这将使您的程序能够访问视频文件。
我不太了解C++,但是TensorFlow经常在拒绝许可时抛出这个错误,所以给它一个机会,祝你好运!p> 您可以使用
ldd
检查您的库是否需要缺少的库

只需检查
ldd load\u video.so

但是,您可能没有链接所使用的某些OpenCV方法需要的共享库

要确保链接并包含所需的每个库,您可以使用
pkg config


手动删除指向OpenCV库的
-I
-l
标志,只需添加
pkg-config--libs--cflags-OpenCV
,它们为您完成了全部工作(包括和链接库)

我尝试过,但没有任何帮助。我认为问题发生在OpenCV尝试访问视频文件之前。堆栈跟踪是否指示代码中发生错误的某一行?对于TensorFlow,您可能会在堆栈跟踪的顶部找到它。OpenCV使用Python、java、C++和C++,所以我建议对于这样的事情,如果你想把OpenCV和TensorFlow结合起来,我建议你用Python、java或C编写所有的东西,不幸的是,我不能用其他方式来帮助。但我可以保证,如果您用Python编写所有内容,那么您的代码应该能够集成—这对我来说很有效!好的,当你完成后,如果有什么不同,请告诉我。
sudo chmod 777 (the name of your video file)