使用 opencv 和 cpp 的应用程序的 Yocto 配方

Yocto recipe for an application that uses opencv and cpp

我为使用 opencv 流式传输图像的 cpp 应用程序创建了一个配方。但是构建失败并出现以下错误:

日志数据如下:

| DEBUG: Executing shell function do_compile
| shot.cpp:1:10: fatal error: core.hpp: No such file or directory
|     1 | #include "core.hpp"
|       |          ^~~~~~~~~~
| compilation terminated.
| WARNING: exit code 1 from a shell command.

尽管如此,我将 meta-openembedded/meta-oe 添加到 bblayers,其中包含我在其中找到 core.hpp 的 opencv 文件夹。

食谱如下:

DESCRIPTION   = " this is an application display an image"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://shot.cpp"


DEPENDS = "opencv"

S = "${WORKDIR}"

do_compile () {
    ${CXX} shot.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_videoio
}

do_install () {

        install -d 0755 ${D}/${bindir}
    install -m 0755  ${D}/${bindir}
}

当我 运行 使用我安装在 ubuntu 18.04 上的 opencv 的应用程序时。它工作正常(使用 cmake)。

我尝试在食谱旁边手动添加核心文件夹,当然没有用,我还在 SRC_URI 变量中将 core.hpp 的路径添加到食谱,但没有运气好 我不知道该怎么做,因为我是 yocto 和 opencv 的新手;请帮忙

这是应用程序的源代码:

#include "core.hpp"
#include "highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main( )
{

      Mat image;

      // LOAD image
      image = imread("image1.jpg");   // Read the file "image.jpg".

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

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

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

我认为你的食谱需要做一些修改:

[...]
inherit pkgconfig
DEPENDS = "opencv"
[...]

并且您需要添加一个 RDEPENDS 和 FILES 变量:

[...]
DEPENDS = "opencv"
# Add the runtime dependencies
RDEPENDS_${PN} = "libopencv-core libopencv-imgproc libopencv-highgui libopencv-videoio libopencv-imgcodecs"

[...]
# At the end, ship the files
FILES_${PN} = "${bindir}"

RDEPENDS_${PN} 会告诉 Yocto 您的食谱包 ${PN} 需要一个 运行 时间依赖项列表。 运行 您的开发板上的应用程序(通常是库)需要这些依赖项。

FILES_${PN} 将告诉 Yocto 您的食谱包 ${PN} 将包含文件。如果没有这一行,Yocto 会告诉你

${PN} 默认是你的食谱文件名(没有版本和 .bb


还有一些错误。

编译有一些问题,没有添加lopencv_imgcodecs,也没有你的二进制文件的输出名称(我已经命名为shot):

do_compile () {
    ${CXX} ${WORKDIR}/shot.cpp -o ${WORKDIR}/shot -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs ${LDFLAGS}
}

第二个安装命令不对:

install -m 0755 ${WORKDIR}/shot ${D}/${bindir}

您的应用程序没有正确的 headers:

#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"

最后,食谱看起来像:

DESCRIPTION   = " this is an application display an image"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://shot.cpp"

inherit pkgconfig
DEPENDS = "opencv"
RDEPENDS_${PN} = "libopencv-core libopencv-imgproc libopencv-highgui libopencv-videoio libopencv-imgcodecs"
S = "${WORKDIR}"

do_compile () {
    ${CXX} ${WORKDIR}/shot.cpp -o ${WORKDIR}/shot -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs ${LDFLAGS}
}

do_install () {
    install -d 0755 ${D}/${bindir}
    install -m 0755 ${WORKDIR}/shot ${D}/${bindir}
}

FILES_${PN} = "${bindir}"

以及申请:

#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main( )
{

      Mat image;

      // LOAD image
      image = imread("image1.jpg");   // Read the file "image.jpg".

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

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

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

该食谱适用于我的 Yocto 战士 meta。