amin这个例子,使用了比较复杂高阶的qml技巧,但是也有局限性。下面分3个部分,分别是界面部分,算法部分和扩展部分,简单地对这个问题进行理解。

   
   由衷感谢:http://amin-ahmadi.com/quick-camera-cv/ 给本程序很多借鉴

 
一、qml界面部分:
1、专门生成了用于提示的dialog
        y

standardButtons
                }
                messageDialog.close()
            }
        }
    }

 
2、整体界面采用swipe和page以及footer的形式,达到了简洁高效
  
        anchors.rightMargin
        anchors.bottomMargin
        anchors.leftMargin
        anchors.topMargin
        anchors.fill: parent
        //TabBar和swipview要对应起来
        onCurrentIndexChanged:
        {
            tabBar.setCurrentIndex(swipeView.currentIndex)
        }

//视频预览
        Page
        {……

 
以及
 
        padding
3、使用了HTML增加文本显示效果,并且是可以切换的
 
  
 Text
                            {
                                id: helpText
                                wrapMode: Text.Wrap
                                anchors.left: parent.left
                                anchors.right: parent.right
                                text: "由衷感谢:<a href=\"http://amin-ahmadi.com/quick-camera-cv/\">http://amin-ahmadi.com/quick-camera-cv</a>" +
                                      "给本程序很多借鉴" +
                                      "<br>" +
                                      "<br>" +
                                      "作者博客:" +
                                      "<br>" +
                                      "<a href=\"jsxyhelu.cnblogs.com\">jsxyhelu.cnblogs.com</a>" +
                                      "<br>" +
                                      "<a href=\"jsxyhelu.cnblogs.com\"><img src=\"http://images2015.cnblogs.com/blog/508489/201607/508489-20160731065441684-483128601.png\"  alt=\"欢迎访问!\"></a>"+
                                      "<br>" +
                                      "<b>版权</b>" +
                                      "本程序使用 <a href=\"http://qt.io/\">Qt Framework</a> 作为GUI" +
                                      "<br>" +
                                      "同时使用 <a href=\"http://opencv.org/\">OpenCV</a> 做图像处理算法." +
                                      "<br>" +
                                      "程序采用ICO来自<a href=\"http://flaticon.com/\">Flat Icon</a>."
                                     onLinkActivated:
                                      {
                                           Qt.openUrlExternally(link); 
                                      }

}

应该这样讲,有这段代码作为例子,那么这种样式的程序在界面上基本不成问题。
 
二、算法实现部分:
    qml是弱语法,比较类似lambda,所以这种语言的使用对于习惯c语言的我来说有难度,想要精通需要时间;另一个方面,因为需要和OpenCV进行交互,所以更复杂一点。本例中综合使用了qml使用c++封装出来的对象,以及“信号、槽”机制等;在摄像头获取和图片采集实现中,硬件层综合使用了qml和qcamera,捕获使用了QCameraImageCapture,具体这样用
在qml中,使用
  //摄像头选择对话框
                    ComboBox
                    {
                        id: cameraCombo
                        Layout.fillWidth: true
                        Layout.fillHeight: true
                        model: QtMultimedia.availableCameras
                        textRole: "displayName"

delegate: ItemDelegate
                        {
                            text: modelData.displayName
                        }
                        onCurrentIndexChanged:
                        {
                            camera.stop()
                            camera.deviceId = model[currentIndex].deviceId
                            camera.start()
                        }
                    }

这样可以获得所有可用摄像头的句柄,然后直接传递到c++中
//调用qcamera进行图像采集
void QCvImageProcessor::setCamera(QVariant v)
{
    QObject *o = qvariant_cast<QObject *>(v);
    camera = qvariant_cast<QCamera *>(o->property("mediaObject"));
    camera->setCaptureMode(QCamera::CaptureStillImage);
    imageCapture = new QCameraImageCapture(camera);
    camera->focus()->setFocusMode(QCameraFocus::ContinuousFocus);
    camera->focus()->setFocusPointMode(QCameraFocus::FocusPointAuto);
    //直接在这里设置动作级联
    connect(imageCapture, &QCameraImageCapture::imageSaved, [this](int id, const QString &fileName)
    {
        Q_UNUSED(id);
        processSavedImage(fileName);
    });
}

void QCvImageProcessor::capture()
{
    if(imageCapture->isReadyForCapture())
    {
        //注意这里获得一个可用的图片地址的方法
        imageCapture->capture(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
       
    }
    else
    {
        emit errorOccured("Camera is not ready to capture.");
    }
}

还是使用QCameraImageCapture,QCamera来完成捕获。
 
由于在andoird中,videocapture不能给使用,那么qcamera作为qt专属,来实现摄像头采集功能是非常合适的,这里给出了具体系统方法。
三、进一步扩展部分:
QCameraImageCapture只能捕获静态图片,但是作为一个完整的图像处理程序,一定要能够处理并显示实时的视频数据,如何解决?继续探索!
感谢阅读至此,希望有所帮助。

附件列表

amin例子的简单研究的更多相关文章

  1. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  2. 简单研究Loader笔记

    2015-11-11 18:25:34 1. Loader是什么? /** * Static library support version of the framework's {@link and ...

  3. SQLSERVER2012 列存储索引的简单研究和测试

    SQLSERVER2012 列存储索引的简单研究和测试 SQLSERVER2012 列存储索引的简单研究和测试 看这篇文章之前可以先看一下下面这两篇文章: 列存储索引 http://www.cnblo ...

  4. SQLSERVER中的LOB页面简单研究

    SQLSERVER中的LOB页面简单研究 这篇文章和我另一篇文章是相辅相成的,在看<SQLSERVER2012 列存储索引的简单研究和测试>这篇文章之前希望大家先看一下这篇文章o(∩_∩) ...

  5. 关于BLOB/TEXT字段存储设计及性能的简单研究

    简单研究了一下BLOB/TEXT字段对数据库性能的影响,得到一个大概的结论:(未验证) 无论MySQL还是MSSQL,都可以通过把BLOB/TEXT数据存储在行外的方式提高性能 把BLOB/TEXT字 ...

  6. 对jQuery ajax三级级联的简单研究

    最近写程序的时候经常遇到使用ajax获取数据的问题,刚好昨天遇到ajax写三级级联问题,自己写了一个简单的级联.对于服务端获取数据的就不多写了,客户端的ajax发送请求我在这里详细说一下,因为我也没专 ...

  7. 简单研究下Retrofit

    2015-09-24 15:36:26 第一部分: 1. 什么是Retrofit? (点击图片有惊喜) 以上是来自官网的解释,言简意赅,咳咳,我就不翻译了~ 2. 如何使用Retrofit? 2.1 ...

  8. 简单研究Android View绘制三 布局过程

    2015-07-28 17:29:19 这一篇主要看看布局过程 一.布局过程肯定要不可避免的涉及到layout()和onLayout()方法,这两个方法都是定义在View.java中,源码如下: /* ...

  9. IOS Animation-CABasicAnimation例子(简单动画实现)

    这些例子都是CABasicAnimation的一些简单实现的动画,例如移动.透明度.翻转等等.方法里面传入一个CALayer类或者子类就可以了. 下面是用swift实现的,这些方法我们也可以用作公共类 ...

随机推荐

  1. 【Python算法】遍历(Traversal)、深度优先(DFS)、广度优先(BFS)

    图结构: 非常强大的结构化思维(或数学)模型.如果您能用图的处理方式来规范化某个问题,即使这个问题本身看上去并不像个图问题,也能使您离解决问题更进一步. 在众多图算法中,我们常会用到一种非常实用的思维 ...

  2. 堆内存泄漏移除导致tcp链接异常高

    故障现象: 1:活动前端Nginx服务器TCP连接数到1万多 2:活动后端Tomcat其中1台TCP连接数达4千,并且CPU瞬间到780%(配置8核16G),内存正常 3:重启后端Tomcat后,TC ...

  3. 开机自启:bat实现一次性打开win7中的常用软件和文件夹

    需求说明: 我们电脑(windows)办公,经常上班前一开机,就要手动打开很多文件夹和程序. 想节省时间,一键打开常用的文件夹和程序,研究了一下bat命令,于是mystart.bat产生了. myst ...

  4. QQ公众号?是的,你没看错!

    微信公众平台培育了800多万的微信公众号,自身也通过微信游戏.广告分销等找到了一些增值盈利模式.作为同门大师兄,qq也在11月份推出了QQ公众号,第一个手机QQ上的“生活服务号”——YTO圆通速递上线 ...

  5. 十天精通CSS3(4)

    text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...

  6. Oracle数据库返回字符类型-1~1的结果处理

    如果实体类中定义的字段是String类型,Oracle数据库中返回的是数字类型,那么Oracle返回0.xxx的时候会丢失前面的0. 要想不丢失0,那么数据库返回的就要是字符串类型的,所以要将返回值转 ...

  7. Django初级手册6-静态文件

    用Django加载外部文件 在Django中iamges,JS或者CSS通称为static文件 定制APP的外观 一般放在应用目录下的static/polls/目录下,下为polls/static/p ...

  8. 020-安装centos6.5后的生命历程

    01.配置网络.修改了ifcfg-eth0文件内容. 1)ifcfg-eth0原来的内容如下: 2)ifcfg-eth0配置后的内容如下:   3)然后重启网络服务: 4)测试网络是否可通: 5)查看 ...

  9. kail linux nmap命令

    可用于: 检测活在网络上的主机(主机发现)检测主机上开放的端口(端口发现或枚举)检测到相应的端口(服务发现)的软件和版本检测操作系统,硬件地址,以及软件版本检测脆弱性的漏洞(Nmap的脚本) ---- ...

  10. Python: 合并多个字典

    现在有多个字典或者映射,想将它们从逻辑上合并为一个单一的映射后执行某些操作,比如查找值或者检查某些键是否存在. eg1: a = {'x': 1, 'z': 3 }b = {'y': 2, 'z': ...