最新版本20200530 Opencv3 调用 USB Camera 编译报错

代码中使用 cv::VideoCapture capture(cameraId);

编译报错如下:

/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clReleaseMemObject@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clReleaseCommandQueue@OPENCL_1.0’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clCreateContext@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clGetPlatformInfo@OPENCL_1.0’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clEnqueueUnmapMemObject@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clCreateCommandQueue@OPENCL_1.0’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clWaitForEvents@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clCreateImage@OPENCL_1.2’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clEnqueueWriteImage@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clReleaseEvent@OPENCL_1.0’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clEnqueueMapImage@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clEnqueueReadImage@OPENCL_1.0’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clGetContextInfo@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clGetSupportedImageFormats@OPENCL_1.0’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clGetExtensionFunctionAddressForPlatform@OPENCL_1.2' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clGetDeviceIDs@OPENCL_1.0’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clRetainCommandQueue@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clGetDeviceInfo@OPENCL_1.0’
/usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clReleaseContext@OPENCL_1.0' /usr/bin/ld: /lib/aarch64-linux-gnu/libavutil.so.56: undefined reference to clGetPlatformIDs@OPENCL_1.0’
collect2: error: ld returned 1 exit status

Opencv使用的版本为 固件自带的Opencv
export OPENCV_ROOT=$SDK_DIR/opencv3-3.4.3

从报错来看是缺少一些库,你看你自己的应用编译依赖哪些库?自己安装下。

我就是依赖你们SDK里面的opencv3 其他没有什么依赖呢。

@liushuan

aml_npu_sdk/linux_sdk/linux_sdk/build/sdk/opencv3/lib$ ls libOpenCL*
libOpenCL.so  libOpenCL.so.1  libOpenCL.so.1.0.0  libOpenCL.so.1.2

应该是你没有链接到正确的文件,这个库在SDK里面是有的

这个是我的编译文件,一直没找到是什么原因呢

include $(AQROOT)/makefile.linux.def
INCLUDE += -I$(OPENCV_ROOT)/modules -I$(OPENCV_ROOT)/modules/highgui/include -I$(OPENCV_ROOT)/modules/core/include -I$(OPENCV_ROOT)/modules/imgproc/include -I$(OPENCV_ROOT)/modules/objdetect/include -I$(OPENCV_ROOT) -I$(OPENCV_ROOT)/modules/imgcodecs/include -I$(OPENCV_ROOT)/modules/videoio/include -I. -I./include

INCLUDE += -I$(VIVANTE_SDK_INC) -I$(VIVANTE_SDK_INC)/HAL -I$(AQROOT)/sdk/inc -I./ -I$(OVXLIB_DIR)/include/utils -I$(OVXLIB_DIR)/include/client -I$(OVXLIB_DIR)/include/ops -I$(OVXLIB_DIR)/include -I$(OVXLIB_DIR)/third-party/jpeg-9b

CFLAGS += $(INCLUDE)

################################################################################

Supply necessary libraries.

LIBS += $(OVXLIB_DIR)/lib/libjpeg.a
LIBS += -L$(OVXLIB_DIR)/lib -lovxlib
LIBS += -lm -lpthread -ldl
LIBS += -L$(OVXLIB_DIR)/lib/ -lz
LIBS += -L$(OPENCV_ROOT)/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_video -lopencv_videoio -lopencv_videostab

LIBS +=-L$(LIB_DIR)/9 -lstdc++

#############################################################################

Macros.

PROGRAM = 1
TARGET_NAME = track
CUR_SOURCE = ${wildcard *.c}
#############################################################################

Objects.

OBJECTS = ${patsubst %.c, $(OBJ_DIR)/%.o, $(CUR_SOURCE)}
OBJECTS += $(OBJ_DIR)/main.o
OBJECTS += $(OBJ_DIR)/siamRPN_tracker.o

installation directory

INSTALL_DIR := ./

################################################################################

Include the common makefile.

include $(AQROOT)/common.target

@liushuan 我看你的LIBS里面没有这个libOpenCL.so库啊

加了 -lOpenCL 还是一样的错误呢。

我就是用 Opencv 的 cv::VideoCapture capture(cameraId);

@liushuan 应该问题还是出在你的Makefile里面,我们的aml_npu_app里面是用了这个函数去获取摄像头数据的,并没有报错

我在aml_npu_app 没找到你们使用的代码呢,具体是哪个文件呢?

@liushuan 旧版的代码里面有,最新的代码,我们已经全部用硬件编解码代替了,旧版代码里面,

string res=str.substr(10);
cv::VideoCapture cap(stoi(res));
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);

你这边还有没有 旧版本 的makefile.linux 的写法呢,有的话给我一份,不胜感激

@liushuan

$ cat makefile_cv3.linux 
include ./makefile.linux.def
INCLUDE += -I$(OPENCV_ROOT)/modules
INCLUDE += -I$(OPENCV_ROOT)/modules/highgui/include
INCLUDE += -I$(OPENCV_ROOT)/modules/core/include
INCLUDE += -I$(OPENCV_ROOT)/modules/imgproc/include
INCLUDE += -I$(OPENCV_ROOT)/modules/objdetect/include
INCLUDE += -I$(OPENCV_ROOT)/modules/imgcodecs/include
INCLUDE += -I$(OPENCV_ROOT)/modules/videoio/include 

INCLUDE += -I. 

INCLUDE += -I$(VIVANTE_SDK_INC)

CXXFLAGS += $(INCLUDE) -std=c++11 -std=gnu++11 -Wall -std=c++11

################################################################################
# Supply necessary libraries.
#LIBS += $(OVXLIB_DIR)/lib/libjpeg.a

LIBS +=  -lpthread -ldl
LIBS += -L$(OPENCV_ROOT)/lib  -lopencv_imgproc -lopencv_core -lopencv_videoio -lopencv_imgcodecs -lopencv_highgui -lz -lm

LIBS += -L$(VIVANTE_SDK_LIB) -lOpenVX -lOpenVXU -lCLC -lVSC -lGAL -lovxlib -lArchModelSw -lNNArchPerf

LIBS += -L../source_code/bin_r -lnn_detect

#LIBS +=-L$(LIB_DIR) -lstdc++


#############################################################################
# Macros.
PROGRAM = 1
TARGET_NAME = detect_demo
CUR_SOURCE = ${wildcard *.c}
#############################################################################
# Objects.
OBJECTS =  ${patsubst %.c, $(OBJ_DIR)/%.o, $(CUR_SOURCE)}
OBJECTS += $(OBJ_DIR)/main_cv3.o
# installation directory
#INSTALL_DIR := ./

OBJ_DIR = bin_r_cv3
################################################################################

# Include the common makefile.

#include $(AQROOT)/common.target

LDFLAGS += -Wall -shared -Wl,-soname,$(TARGET_NAME) -Wl,-z,defs

TARGET_OUTPUT = $(OBJ_DIR)/$(TARGET_NAME)

all: $(TARGET_OUTPUT)

clean:
	@rm -rf $(OBJ_DIR)/* $(OBJ_DIR)

install: $(TARGET_OUTPUT)
	@mkdir -p $(INSTALL_DIR)
	@-cp $(TARGET_OUTPUT) $(INSTALL_DIR)

$(TARGET_OUTPUT): $(OBJECTS)
	@$(CXX) $(OBJECTS) -o $(TARGET_OUTPUT) $(LIBS)

$(OBJ_DIR)/%.o: %.c
	@echo "  COMPILE $(abspath $<)"
	@mkdir -p $(OBJ_DIR)
	@$(CC) $(LDFLAGS) -c $(CFLAGS) -o $@ $<

$(OBJ_DIR)/%.o: %.cpp
	@echo "  COMPILE $(abspath $<)"
	@mkdir -p $(OBJ_DIR)
	@$(CXX) -c $(CXXFLAGS) -o $@ $<


这仓库是开源的,你自己回退git代码就能看到了

替换了还是不行,我觉得应该是你们的新版本系统,编译的Opencv3没有支持视频的读写了。

@liushuan 你是在板子上编译的么?

嗯嗯,是的,我是把SDK 拷贝到板子上面,然后在板子上面做的编译,用的板子自带的opencv3

@liushuan 你的系统更新到最新的了么

是更新到最新了。这两天刚更新的。# dmesg |grep “Gal”
[ 17.322420] Galcore version 6.4.3.279124CB

我正常用opencv的 读图片和 imshow图片都是没问题的,就是一用读摄像头的接口就编译不过

@liushuan
这是我的测试代码

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
#include <string>
using
namespace  cv;

using
namespace  std;

int main(int argc, char** argv)
{
    int count=100;
    string str = argv[1];
    string res=str.substr(10);
    VideoCapture capture(stoi(res));
        capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
    capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
    while (count)
    {
        Mat frame;
        capture >> frame;

        if (frame.empty()) {
            break;
        }
        int h = frame.rows;
        int w = frame.cols;
        const char *name = "video";
        cvNamedWindow(name, 0);
        cvResizeWindow(name, w / 1, h / 1);
        imshow(name, frame);
        waitKey(30);
        count--;
    }
    return 0;
}

这是编译命令

$ gcc -o test test.cpp -lopencv_imgproc -lopencv_core -lopencv_videoio -lopencv_imgcodecs -lopencv_highgui -std=c++11 -std=gnu++11 -Wall -std=c++11 -lstdc++

你在板子上试试,能不能编译

我试了你这个测试程序 的确可以编译通过,不过当我运行程序的时候,程序会卡在 VideoCapture capture(stoi(res)); 不出来, 我把输入改成视频文件是可以的, 这是为什么呢?

@liushuan 这只是程序实现上的问题,你可以看看源码,那么就是问题出在你的makefile上了,你多检查一下,应该是你哪里链接不正确