我尝试使用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)
我甚至不清楚究竟是什么问题。我该如何解决?
答案 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 run
或bazel test
运行测试,请忽略此项。您阅读tensorflow/test/imageHolder/data/example.jpg
但是,bazel再次不知道此文件,因此您应将其添加为data
依赖项。我要进一步调试这个是用sandbox_debug
运行bazel以查看bazel将哪些文件复制到沙箱,并使用--subcommands
查看bazel生成的命令行并查看更改内容。您还可以在tf_cc_binary宏实现中逐步添加/删除属性,以查看哪些更改会触发问题。