草庐IT

android - Qt QML Camera 到 Android 上的 C++ QImage

coder 2023-11-19 原文

我有一个基于 Qt5.4 的程序,可以进行一些图像处理。我使用 QCamera 和我的 videoSurface(派生自 QAbstractVideoSurface)来获取 VideoFrames。它在 Windows 上运行良好。

但现在我需要我的应用程序的 Android 版本。我发现 QCamera 不适用于 Android。但我看到 QML Camera 示例在 Android 上运行没有问题。

所以我决定用 QML 重写我的应用程序。 主要问题:我无法在 C++ 中访问 QML Camera 表面。

void myVideoOutput::setSource(QObject *source)
{
    qDebug() << Q_FUNC_INFO << source;

    if (source == m_source.data())
        return;
    m_source = source;
    if (m_source) {
        const QMetaObject *metaObject = m_source.data()->metaObject();

        QStringList properties;
        for(int i = metaObject->propertyOffset(); i < metaObject >propertyCount(); ++i)
            properties << QString::fromLatin1(metaObject->property(i).name());
        qDebug() << properties;

    }
    .....
    emit sourceChanged();
}

此代码提供对属性的访问。但我无法通过这种方式访问​​ videoSurface(使用 QCamera 我可以做到)。我想知道 QML Camera 是如何工作的?它是基于QCamera吗?我在 QDeclarativeCamera 中看到 QCamera *m_camera...

所以我有两个问题:

  1. 是否可以使用 QML Camera 在 C++ 中对图像进行后处理?工作示例将非常有值(value)。
  2. 您知道在 Qt 中从 Android 摄像头捕获视频的其他方法吗?

最佳答案

1) 是的,这是可能的。我想出了两种方法。

将 QAbstractVideoFilter 与 QVideoFilterRunnable 类(仅限 QT 5.5!)一起使用,这非常棒。它们是专门为这种情况开发的,非常易于使用。

网络上有一些很好的使用它的例子:

https://blog.qt.io/blog/2015/03/20/introducing-video-filters-in-qt-multimedia/

http://code.qt.io/cgit/qt/qtmultimedia.git/tree/examples/multimedia/video/qmlvideofilter_opencl

如前所述,这种方法的缺点是 here ,是在 Android 设备上,QVideoFrame 指针没有原始像素数据,相反,它有一个需要回读的 OpenGL 纹理(我发布的第二个示例有解决此问题的解决方法),因此使这种方法不太适合实际时间目的恕我直言。

我最终用来解决这个问题的是 QVideoProbe类。

首先你必须命名你的 QML 相机的实例:

    Camera {
    id: camera

    objectName: "qrCameraQML"
}

然后你从 C++ 端得到这个实例,像这样:

QObject *qmlCamera = engine.rootObjects().at(0).findChild<QObject*>("qrCameraQML");

QML 相机实例实际上有一个只能通过 C++ 访问的 QVariant 元素,该元素可以转换为 QCamera*:

camera_ = qvariant_cast<QCamera*>(qmlCamera->property("mediaObject"));

然后您所要做的就是将探头连接到一个实际处理 QVideoFrames 的插槽,然后将探头的源设置为之前转换的 QCamera*:

    connect(&probe_,SIGNAL(videoFrameProbed(QVideoFrame)),this,SLOT(handleFrame(QVideoFrame)));

probe_.setSource(camera_);

在我的示例中,camera_ 和 probe_ 很简单:

    QCamera *camera_;

QVideoProbe probe_;

根据我的经验,这种方法(对于 Android 平台)比使用 qt 视频过滤器类要快得多,但它的缺点是您基本上只能从 qml 读取视频输出,而且据我所知,您将无法发送经过处理的视频视频帧返回到 qml。

如果您真的需要将处理后的图像发送回 qml,我建议您尝试第一种方法,看看会发生什么。

2) 不使用 Qt AFAIK,可能使用 OpenCv 或其他一些库。

关于android - Qt QML Camera 到 Android 上的 C++ QImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28041741/

有关android - Qt QML Camera 到 Android 上的 C++ QImage的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  9. 带有 attr_accessor 的类上的 Ruby instance_eval - 2

    我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到

  10. ruby-on-rails - rails 上的 ruby : radio buttons for collection select - 2

    我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/

随机推荐