OpenCV(Open Source Computer Vision Library)是一个跨平台的计算机视觉开源库,其中包含了数百种计算机视觉算法。因此OpenCV提供的功能十分丰富,从图像处理(比如图片格式的转换),到计算机视觉(比如动作识别,人脸识别等),都可以通过OpenCV来实现。所以OpenCV在各个领域中都有较广泛的应用,更加详细的说明可以参考OpenCV的中文网站http://www.opencv.org.cn/。
英创公司在Linux主板中移植了OpenCV,能够支持的主板有ESM6800E/H,ESM7000,ESM6802以及ESM8000系列的主板。其中ESM6800E/H和ESM7000系列主板中没有GPU和VPU,所以比较适合进行图像的处理,比如图片的分割、格式转化等。而ESM6802与ESM8000系列主板带有GPU与VPU,可以做一些简单的视频方面的处理,比如人脸侦测、动作识别等。具体可以参考下面的表格:
主板型号 | CPU性能 | GPU | VPU | OpenCV版本 | 支持语言 | 推荐应用 |
ESM6800E/H | Crotex-A7 主频798MHz | 否 | 否 | 3.2 | C++ | 可以用于图像处理 |
ESM6802系列 | 双核Crotex-A 主频1GHz | 是 | 是 | 3.2 | C++ | 可以用于简单的视频处理 |
ESM7000系列 | 双核Crotex-A 主频1GHz | 否 | 否 | 3.2 | C++ | 可以用于图像处理 |
ESM8000系列 | 四核64位Crotex-A53 主频1.6GHz | 是 | 是 | 4.2 | C++/python3 | 可以用于简单的视频处理 |
关于图像处理,可以通过调用OpenCV提供的API来实现,比较简单。而在视频的处理上,主板中OpenCV的视频操作都是基于Gstreamer来实现的,具体可以参考下图:
从图中可以看出,OpenCV的提供的Video I/O可以基于多种Backends,而主板中的Backends支持的是Gstreamer。因为Gstreamer中已经包含了可以调用GPU和VPU的插件,对用户来说就可以不必关心如何去调用GPU与VPU,只需要做上层的应用开发,使用起来会更加简单。因为OpenCV的跨平台性,而基于Opencv实现的一些开源算法,比如人脸识别,动作识别等,都可以直接移植到主板上使用。
最后是关于显示界面的问题,OpenCV中提供了显示的API,在Linux主板中,调用显示API后可以显示出一个OpenCV的窗口(底层是基于Qt实现的)。但是对于用户来说,通常情况下OpenCV只是其中一部分功能,在显示界面上可能还需要显示一些其他的数据,这个时候就推荐客户使用Qt+OpenCV的方式来实现。Qt实现基本的界面显示,而OpenCV用于处理图像或者视频,处理好的数据再通过Qt的控件显示出来。
我们以在ESM8000主板上显示网络摄像头的画面为例,来进行演示。下面的代码可以通过OpenCV提供的API实现一个窗口来显示网络摄像头的画面:
#include <opencv2/opencv.hpp> int main() { cv::VideoCapture cap; /* gstreamer 参数 */ if (!cap.open("rtspsrc location=rtsp://user:passwd@ip:port/ latency=0 ! queue ! rtph264depay ! vpudec ! queue ! imxvideoconvert_g2d ! capsfilter caps=\"video/x-raw,format=(string)RGBA\" ! videoconvert ! queue ! appsink sync=false", cv::CAP_GSTREAMER)) { std::cout << "Unable to open video capture\n"; return -1; } return 0; */ while(true) { cv::Mat frame; /* 获取显示数据 */ auto ret = cap.grab(); cap >> frame; if (frame.empty()) { break; // End of video stream } cv::resize(frame, frame, cv::Size(640, 480)); // Do other stuff here with frame /* 显示 */ cv::imshow("frame", frame); if (cv::waitKey(10) == 27) { break; // stop capturing by pressing ESC } } return 0; }
通过代码可以看到,在调用cv::imshow("frame", frame)后,就会显示一个窗口出来。但是这是OpenCV提供的显示窗口,只会显示视频数据,如果用户需要显示其他数据,就不方便了。这个时候就可以选择使用Qt的控件来显示读取到的frame,可以参考下面的代码来替换cv::imshow("frame", frame)函数:
/* 转换格式 */ cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB); /* 通过Qt控件来显示 */ QPixmap pix = QPixmap::fromImage(QImage((unsigned char*) frame.data, frame.cols, frame.rows, QImage::Format_RGB888)); label->setPixmap(pix);
上面的代码中,将OpenCV读取的数据通过一个label显示出来。基于这种方式,用户可以更加灵活地设计界面,然后指定一个控件用于显示视频数据:
本文简单介绍了Linux主板对OpenCV的支持,感兴趣的客户可以通过联系英创公司的工程师获取更多的资料和例程。
成都英创信息技术有限公司 028-8618 0660