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里,
可以看到執行的結果和實際圖片的尺寸是相同的。
往期內容見: