嵌入式Linux系列第17篇:移植OpenCV

topsemic 發佈 2020-01-17T08:49:38+00:00

1.引言OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,它提供了很多函數,這些函數非常高效地實現了計算機視覺算法。

1.引言

OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,它提供了很多函數,這些函數非常高效地實現了計算機視覺算法。OpenCV 的應用領域非常廣泛,包括圖像拼接、圖像降噪、產品質檢、人機互動、人臉識別、動作識別、動作跟蹤、無人駕駛等。本篇介紹ARM Linux下OpenCV的移植和簡單使用。

2.環境介紹

2.1.硬體

1) NUC972開發板:

2.2.軟體

1) Uboot使用上一篇的,不需要改動。

2) Kernel使用上一篇的,不需要改動。

3) Rootfs在上一篇基礎上,需要改動。

3.Buildroot配置

為了支持OpenCV,Buildroot里需要做如下改動:

編譯完成後,我們在/home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/lib 下可以看到多了OpenCv的相關庫

然後按照之前章節介紹的方法,重新製作一個新的roofs。

4.編譯一個OpenCv程序

opencvtest.c文件

#include <cv.h>

#include <highgui.h>

#include <stdio.h>

int main(int argc,char *argv[])

{

IplImage *image=cvLoadImage("test.bmp",1);

if(NULL==image)

{

printf("fail to load the image\r\n");

}

printf("the size of test.jpg is image width:%d image height:%d\r\n",image->width,image->height );

return 0;

}

如果直接這樣編譯:

arm-linux-gcc opencvtest.c -o opencvtest

會提示如下錯誤,原因是找不到opencv相關的頭文件

Opencv的頭文件在哪呢?

在/home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/include/ 目錄的opencv和opencv2文件夾里

所以需要在上述編譯指令中添加頭文件路徑,-I (注意是大寫的i) 給arm-linux-gcc添加自定義的頭文件的路徑

arm-linux-gcc opencvtest.c -o opencvtest -I /home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/include/ -I /home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/include/opencv -I /home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/include/opencv2

再次編譯,又報錯了,提示一堆函數無定義

這是咋回事?原因是雖然指明了頭文件,但是在連結的時候找不到對應的庫,需要再指明opencv依賴的庫所在的地方,-L 給arm-linux-gcc添加額外的搜索庫的路徑

arm-linux-gcc opencvtest.c -o opencvtest -I /home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/include/ -I /home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/include/opencv -I /home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/include/opencv2 -L /home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/lib /home/topsemic/nuc972/buildroot/NUC970_Buildroot/output/host/usr/arm-nuvoton-linux-uclibcgnueabi/sysroot/usr/lib/*.so

這樣就可以編譯成功了。

5.運行程序

1) 將編譯生成的可執行程序和一張test.bmp圖片放到板子上執行,

又報了如下錯誤

2)根據提示將buildroot里這個庫放到板子的/usr/lib里,

可以看到執行的結果和實際圖片的尺寸是相同的。

往期內容見:

關鍵字: