TA的每日心情 | 奋斗 2024-4-10 08:31 |
---|
签到天数: 300 天 连续签到: 1 天 [LV.8]以坛为家I
|
拿到板子一般来说应该先点个灯的,不过个人对1.2G A53的性能还是相当期待,因此想先测试下。
但这一周早些时候花费了大量时间寻找交叉编译opencv的方法,折腾了很久,最后才发现板子TF卡自带的镜像竟然有opencv库。加上gcc编译链也齐全,因此测试用的小程序都可以在板子上直接编译。
本来个人对Qt生态比较依赖,看了下板子的库,竟然也有Qt,还是5.9.6版本,一个相当新的版本了:
opencv也是3.3.0,这大概是18-19年才推出的版本:
一开始还相当满意,觉得这块工控板生态很不错。然而很快啊,我就发现我还是想得太简单:
对于这个问题,搜到的解决方案都是不太搭边的,目前猜测大概还是因为用交叉编译环境构建Qt的时候有某些地方没有配置对吧。从板载的库来说,这个带有百度AI的镜像应该是经过深度定制的,其他功能都挺完善的,没有发现特别的问题,但官方没有提供这个镜像的交叉编译环境,想要自己提取再重新交叉编译Qt还是挺复杂的,因此暂时避开Qt。失去了Qt的qmake,只能寻求不太熟悉的cmake了。
所幸opencv所在的/usr/lib是系统能够自动识别的路径,如果是/usr/local/lib下面,编写CmakeList.txt的时候就麻烦了。
新建一个canny文件夹,进去新建一个canny.c文件:
现在测试一段canny算子运算能力:
- #include <opencv2/opencv.hpp>
- #include<opencv2/highgui/highgui.hpp>
- #include<opencv2/imgproc/imgproc.hpp>
- using namespace cv;
- //-----------------------------------【main( )函数】-------------------------------------------
- // 描述:控制台应用程序的入口函数,我们的程序从这里开始
- //-----------------------------------------------------------------------------------------------
- int main()
- {
- struct timespec tpstart;
- struct timespec tpmiddle;
- struct timespec tpend;
- long timedif;
- clock_gettime(CLOCK_MONOTONIC, &tpstart);
- //载入原始图
- Mat srcImage = imread("/home/qt/qt_for_opencv/28.jpg",1); //工程目录下应该有一张名为1.jpg的素材图
- Mat srcImage1 = srcImage.clone();
- //显示原始图
- ///imshow("【原始图】Canny边缘检测", srcImage);
- clock_gettime(CLOCK_MONOTONIC, &tpmiddle);
- //----------------------------------------------------------------------------------
- // 一、最简单的canny用法,拿到原图后直接用。
- //----------------------------------------------------------------------------------
- //Canny(srcImage, srcImage, 150, 100, 3);
- ///imshow("【效果图】Canny边缘检测", srcImage);
- //----------------------------------------------------------------------------------
- // 二、高阶的canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图
- //----------------------------------------------------------------------------------
- Mat dstImage, edge, grayImage;
- // 【1】创建与src同类型和大小的矩阵(dst)
- dstImage.create(srcImage1.size(), srcImage1.type());
- // 【2】将原图像转换为灰度图像
- cvtColor(srcImage1, grayImage, CV_BGR2GRAY);
- // 【3】先用使用 3x3内核来降噪
- blur(grayImage, edge, Size(3, 3));
- // 【4】运行Canny算子
- Canny(edge, edge, 3, 9, 3);
- //【5】将g_dstImage内的所有元素设置为0
- dstImage = Scalar::all(0);
- //【6】使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
- srcImage1.copyTo(dstImage, edge);
- //【7】显示效果图
- ///imshow("【效果图】Canny边缘检测2", dstImage);*/
- clock_gettime(CLOCK_MONOTONIC, &tpend);
- timedif = 1000000 * (tpend.tv_sec - tpstart.tv_sec) + (tpend.tv_nsec - tpstart.tv_nsec) / 1000;
- fprintf(stdout, "it took %ld microseconds\n", timedif);
- timedif = 1000000 * (tpend.tv_sec - tpmiddle.tv_sec) + (tpend.tv_nsec - tpmiddle.tv_nsec) / 1000;
- fprintf(stdout, "it took %ld microseconds\n", timedif);
- waitKey(0);
- return 0;
- }
复制代码
新建CmakeList.txt,添加内容:
- # project name
- PROJECT(canny)
- # requirement of cmake version
- cmake_minimum_required(VERSION 3.5)
- # set the directory of executable files
- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ./)
- # find required opencv
- find_package(OpenCV REQUIRED)
- # directory of opencv headers
- include_directories(${OpenCV_INCLUDE_DIRS})
- # name of executable file and path of source file
- add_executable(canny canny.cpp)
- # directory of opencv library
- link_directories(${OpenCV_LIBRARY_DIRS})
- # opencv libraries
- target_link_libraries(canny ${OpenCV_LIBS})
复制代码
执行命令:
执行make:
canny算子:
blur算子:
contours:
实际上还有个自己写的小程序的,应用了surf在内的几个算子,同样的A53四核运算时间在1s以上,更能看出测试效果。但在2020年之前surf算子的专利还没有过期,因此一直放在opencv的contrib模块,这个板子的opencv库明显是没有编译contrib模块的,因此只能遗憾地放弃了。
没有对比就不够直观。为了直观感受这个板子纯CPU运算能力到底如何,还缺一个横向对比。
但看了一遍手上的其他板子,性能都太过羸弱,与之相近的同样A53 4核的树莓派只能跑个32位系统,简直是虐菜。找来找去还是一块晶辰的S905比较合适,这颗核心时28nm制程,主频1.5G,比这块板子主频高一点,但制程落后,GPU同样位Mail-T450。
顺便附上手头其他板子,包括树莓派在内的一些测试结果:
同样的4核ARM A53看起来差距不大,性能都相当可以,ZU3低频还略占上风,纯CPU性能是足够通用计算了,接下来就是看AI部分了。
|
|