首页 > 解决方案 > 如何将库集成到我的库中

问题描述

我制作了自己的使用 Opencv 和其他库的库。这里是

CMakelists.txt of my library:

cmake_minimum_required(VERSION 3.0)

project("face_module")

add_definitions("-std=c++11" "-Wno-write-strings")

file(GLOB_RECURSE SOURCES "*.cpp"")
file(GLOB_RECURSE HEADERS "*.h"")
add_library("face_module" SHARED ${SOURCES} ${HEADERS})
target_include_directories(
    "face_module" PUBLIC "include" )

find_package(OpenCV 3.2.0 REQUIRED)
find_package(jsoncpp REQUIRED)

set( JSONCPP_LIBRARIES    jsoncpp curl )
SET(OpenCV_LIBS  opencv_core opencv_highgui opencv_videoio opencv_imgproc opencv_imgcodecs )

target_link_libraries("face_module"
    "${CMAKE_CURRENT_LIST_DIR}/lib/tensorflow/libtensorflow.so"
    "${CMAKE_CURRENT_LIST_DIR}/lib/tensorflow/libtensorflow_framework.so"
    ${OpenCV_LIBS}
    ${JSONCPP_LIBRARIES}
    pthread)

我在我的程序中使用了那个库和 Opencv:

cmake_minimum_required(VERSION 3.0)

project("database_generator")

add_definitions("-std=c++11" )

file(GLOB SOURCES  "database_generator.cpp")
file(GLOB HEADERS "")

add_executable("database_generator" ${SOURCES} ${HEADERS})
target_link_libraries("database_generator"
 "face_module")

当我在我的 database_generator 项目中使用 OpenCV VideoCapture 时,网络摄像头向我发送了黑色图像。我不明白为什么会这样。正如您在 database_generator 的 CmakeLists.txt 中看到的那样,我没有添加 Opencv 库,因为它也添加到了我的 face_module 库中。

在我的图书馆的一代中,我做了什么坏事?

这是我的 database_generator 的主文件

int main(int argc, char **argv) {
    cv::VideoCapture *video_capture = new cv::VideoCapture(0);

    if (!video_capture->isOpened()) {
        std::cerr << "Can't open camera " << 0 << std::endl;
    }

    while(1) {
        cv::Mat u8x3_image;

        *video_capture >> u8x3_image;
        std::cout << "lalal"<< u8x3_image.empty() << std::endl;
        cv::imshow("facedetector", u8x3_image);
        cv::waitKey(100);
    }
}

使用前面的代码,相机会向我发送正常图像,但是一旦我使用我的库中的一个类,网络摄像头发送的图像是黑色的......

编辑:我也尝试在我的库中做所有事情我只是生成一个可执行文件(没有库)

project("database_generator2")

add_definitions("-std=c++11" )

file(GLOB_RECURSE SOURCES "*.cpp"  "../module/database_generator.cpp")
file(GLOB_RECURSE HEADERS "*.h" )
add_executable("database_generator2" ${SOURCES} ${HEADERS})
target_include_directories(  "database_generator2" PUBLIC "include" )

find_package(OpenCV 3.2.0 REQUIRED)
find_package(jsoncpp REQUIRED)

set( JSONCPP_LIBRARIES    jsoncpp curl )
SET(OpenCV_LIBS  opencv_core opencv_highgui opencv_videoio opencv_imgproc opencv_imgcodecs )

target_link_libraries("database_generator2"
    "${CMAKE_CURRENT_LIST_DIR}/lib/tensorflow/libtensorflow.so"
    "${CMAKE_CURRENT_LIST_DIR}/lib/tensorflow/libtensorflow_framework.so"
    ${OpenCV_LIBS}
    ${JSONCPP_LIBRARIES}
    pthread)

我也有同样的麻烦,所以问题不是由于库生成。我认为它来自 tensoflow 库 libtensorflow_framework.so libtensorflow.so 但我不明白为什么。

    libtensorflow_framework.so:
    linux-vdso.so.1 =>  (0x00007fff575d2000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7afda2b000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7afd722000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7afd505000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7afd183000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7afcf6d000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7afcba3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7afe7f9000)
libtensorflow.so:
    linux-vdso.so.1 =>  (0x00007ffc32ba1000)
    libtensorflow_framework.so => /home/xavier/Desktop/developpement/Network/pam_face_module/library/lib/tensorflow/./libtensorflow_framework.so (0x00007f0bc5a55000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0bc5851000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0bc5634000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0bc532b000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0bc4fa9000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0bc4d93000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0bc49c9000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f0bc9233000)

这真的很奇怪,因为 opencv 的 imread 功能可以正常工作,但是 VideoCapture 给我发送了黑色图像:(

Edit2:这太疯狂了,事实上,只要我使用 tensorlow 对象,VideoCapture 就会向我发送黑色图像......这可能来自 tensorflow 库编译吗?

标签: c++opencvtensorflowcmake

解决方案


如果您使用未正确链接的库,您甚至不会获得可执行文件。

这应该有帮助

http://answers.opencv.org/question/129659/i-want-to-read-image-captured-by-webcam-videocapture-and-write-that-to-some-external-file/


推荐阅读