tf_cc_binary()使opencv无法加载图像

时间:2017-09-24 20:01:01

标签: c++ opencv tensorflow bazel

我尝试使用opencv加载图像,并使用tensorflow框架进一步处理它。不幸的是,我得到了一个非常奇怪的行为:

使用Bazel中的cc_binary(...)可以毫无问题地加载图像。将其更改为tf_cc_binary(...)并不会阻止编译或运行代码,但opencv无法再加载任何图像。

load("//tensorflow:tensorflow.bzl", "tf_cc_binary")

#tf_cc_binary( <-- using this, no image could be loaded anymore
cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    linkopts = [
        "-lopencv_core",
        "-lopencv_highgui",
        "-lopencv_imgcodecs",
        "-lopencv_imgproc",
    ],
    visibility=["//visibility:public"]
)

我使用opencv网站上的标准示例代码。同样,它正常工作,并使用cc_binary(加载图像:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, char** argv )
{
    Mat image;
    image = imread("tensorflow/test/imageHolder/data/example.jpg", CV_LOAD_IMAGE_COLOR);   // Read the file

    if(! image.data )                              // Check for invalid input
    {
        cout <<  "Could not open or find the image" << std::endl ;
        return -1;
    }

    namedWindow( "Display window", WINDOW_AUTOSIZE );// Create a window for display.
    imshow( "Display window", image );                   // Show our image inside it.

    waitKey(0);                                          // Wait for a keystroke in the window
    return 0;
}

我找到了tf_cc_binary(...)的定义:

# Links in the framework shared object
# (//third_party/tensorflow:libtensorflow_framework.so) when not building
# statically. Also adds linker options (rpaths) so that the framework shared
# object can be found.
def tf_cc_binary(name,
                 srcs=[],
                 deps=[],
                 linkopts=[],
                 **kwargs):
  native.cc_binary(
      name=name,
      srcs=srcs + _binary_additional_srcs(),
      deps=deps + if_mkl(
          [
              "//third_party/mkl:intel_binary_blob",
          ],
      ),
      linkopts=linkopts + _rpath_linkopts(name),
      **kwargs)

我甚至不清楚究竟是什么问题。我该如何解决?

1 个答案:

答案 0 :(得分:1)

tf_cc_binary只是cc_binary周围的一个宏,用于添加一些张量流特定属性(从我看到的代码中添加//tensorflow:libtensorflow_framework.so和一些rpaths。我不知道知道是什么原因导致你的问题,但我有两个嫌疑人:

  • 你依赖libopencv_core,但是bazel并不知道它是一个依赖(这里有一个关于这个问题的好主题:https://groups.google.com/forum/#!topic/bazel-discuss/Ndd820uaq2U
  • 如果您未使用bazel runbazel test运行测试,请忽略此项。您阅读tensorflow/test/imageHolder/data/example.jpg但是,bazel再次不知道此文件,因此您应将其添加为data依赖项。

我要进一步调试这个是用sandbox_debug运行bazel以查看bazel将哪些文件复制到沙箱,并使用--subcommands查看bazel生成的命令行并查看更改内容。您还可以在tf_cc_binary宏实现中逐步添加/删除属性,以查看哪些更改会触发问题。