前言
在openCV4.5.2之前,自身的库无法在android下,拉取本地摄像头的流,现在的版本可以拉取了,笔者本次做下记录
在开始前需要读者参考以下文档,编译库
Qt+openCV学习笔记(十三)openCV4.5.5+android-ndk-r22-windows-x86_64编译动、静态库_꧁白杨树下꧂的博客-优快云博客
一、编写关键代码
笔者使用Qt6.3.0测试的,关于新建工程、如何引用openCV库,笔者不再重复,直接上关键代码
1.打开摄像头
cv::VideoCapture cap;
cap.open(0);
if (!cap.isOpened())
{
std::cerr << "can't open camera " << fd << std::endl;
return -1;
}
和其他系统下相同,摄像头是从0开始排列的,
若有多个,直接+1就可以,(openCV这点很不友好,期待再加个获取名称的接口)
while(true)
{
cap >> frame;
if (frame.empty())
{
std::cerr << "cannot find frame" << std::endl;
break;
}
#ifdef Q_OS_ANDROID
cvtColor(frame, frame, cv::COLOR_YUV2BGR_NV21);
#endif
//do something
}
获取一帧也很简单,和其他系统没区别。但是要注意,获取帧的颜色空间与其他平台可能不一样。笔者使用的是华为平板测试,发现获取的帧是yuv格式的,若要在Qt中显示,需要出转换成RGB格式的。
受限于硬件,笔者未测试其他设备,请小伙伴自行测试修改
二、编译运行
只要库设置正确了,编译就可以正常进行,但笔者运行后提示,没有打开摄像头的权限
系统设置中却没有摄像头权限,Qt6.3中请求权限接口还是私有的,没办法直接使用,于是笔者增加了Qt多媒体模块,增加摄像头权限后,终于打开了摄像头
本是件高兴的事,但笔者一旋转平板,傻眼了
openCV获取的图像已经旋转过了,正常使用时,还需要再纠正下
笔者尝试打开前置摄像头,也可以正常拉流。
后记
笔者没有进行分辨率等设置的测试,直接拉取网络流也未成功
感觉当前还是使用Qt的接口轻松点,openCV的还是要再等下