代码中使用 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
numbqq
2
从报错来看是缺少一些库,你看你自己的应用编译依赖哪些库?自己安装下。
我就是依赖你们SDK里面的opencv3 其他没有什么依赖呢。
Frank
4
@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
Frank
6
@liushuan 我看你的LIBS里面没有这个libOpenCL.so库啊
加了 -lOpenCL 还是一样的错误呢。
我就是用 Opencv 的 cv::VideoCapture capture(cameraId);
Frank
8
@liushuan 应该问题还是出在你的Makefile里面,我们的aml_npu_app里面是用了这个函数去获取摄像头数据的,并没有报错
我在aml_npu_app 没找到你们使用的代码呢,具体是哪个文件呢?
Frank
10
@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 的写法呢,有的话给我一份,不胜感激
Frank
12
@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没有支持视频的读写了。
嗯嗯,是的,我是把SDK 拷贝到板子上面,然后在板子上面做的编译,用的板子自带的opencv3
是更新到最新了。这两天刚更新的。# dmesg |grep “Gal”
[ 17.322420] Galcore version 6.4.3.279124CB
我正常用opencv的 读图片和 imshow图片都是没问题的,就是一用读摄像头的接口就编译不过
Frank
18
@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)); 不出来, 我把输入改成视频文件是可以的, 这是为什么呢?
Frank
20
@liushuan 这只是程序实现上的问题,你可以看看源码,那么就是问题出在你的makefile上了,你多检查一下,应该是你哪里链接不正确