Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Can we access camera and alarm clock on Android devices through Qt5.1.0 Android build?
QtWS25 Last Chance

Can we access camera and alarm clock on Android devices through Qt5.1.0 Android build?

Scheduled Pinned Locked Moved Mobile and Embedded
11 Posts 4 Posters 5.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    jiangcaiyang
    wrote on last edited by
    #1

    I am making an experiment on Qt5.1.0 Android build to test whether these functionalities are applicable through Qt, or can we find workaround ( ie. 3rd party library through C++ ) to meet these demand?

    1 Reply Last reply
    0
    • S Offline
      S Offline
      stereomatching
      wrote on last edited by
      #2

      Qt5.1 do not support camera yet, you have to wait for Qt5.2 for full support. Qt5.1 is a technical preview only.

      This blog has the answer you want
      "Qt5.1 RC":http://blog.qt.digia.com/blog/2013/06/18/qt-5-1-release-candidate-available/

      Maybe you could give openCV a try, it should be able to access the camera of android.

      1 Reply Last reply
      0
      • J Offline
        J Offline
        jiangcaiyang
        wrote on last edited by
        #3

        [quote author="stereomatching" date="1371841980"]Qt5.1 do not support camera yet, you have to wait for Qt5.2 for full support. Qt5.1 is a technical preview only.

        This blog has the answer you want
        "Qt5.1 RC":http://blog.qt.digia.com/blog/2013/06/18/qt-5-1-release-candidate-available/

        Maybe you could give openCV a try, it should be able to access the camera of android.

        [/quote]
        How about alarm clock? I've searched the Internet and find there is a service in controling Android internal alarm clock. How does Qt handle Android service? Thanks.
        hey, stereomatching, are you the one who is active at CSDN Qt forum?

        1 Reply Last reply
        0
        • S Offline
          S Offline
          stereomatching
          wrote on last edited by
          #4

          [quote author="jiangcaiyang" date="1371911455"]
          How about alarm clock? I've searched the Internet and find there is a service in controling Android internal alarm clock. How does Qt handle Android service? Thanks.
          [/quote]
          Sorry, I don't know the answer

          [quote author="jiangcaiyang" date="1371911455"]
          hey, stereomatching, are you the one who is active at CSDN Qt forum?
          [/quote]
          Not sure who you are talking about, but I do have an account on CSDN.

          1 Reply Last reply
          0
          • M Offline
            M Offline
            Moster
            wrote on last edited by
            #5

            Do you still need to access the camera or was that more like a general quesstion? I could provide an example project that uses opencv to access the camera

            1 Reply Last reply
            0
            • S Offline
              S Offline
              stereomatching
              wrote on last edited by
              #6

              [quote author="Moster" date="1372151432"]Do you still need to access the camera or was that more like a general quesstion? I could provide an example project that uses opencv to access the camera[/quote]

              Please show us your example, I tried it before on desktop, but haven't tried it on android yet.

              .hpp
              @
              #ifndef OPENCVCAMERA_HPP
              #define OPENCVCAMERA_HPP

              #include <QQuickPaintedItem>
              #include <QString>

              #include <opencv2/core/core.hpp>
              #include <opencv2/highgui/highgui.hpp>

              class QPainter;
              class QTimer;

              class openCVCamera : public QQuickPaintedItem
              {
              Q_OBJECT
              Q_PROPERTY(int imageHeight READ imageHeight WRITE setImageHeight NOTIFY imageHeightChanged)
              Q_PROPERTY(int imageWidth READ imageWidth WRITE setImageWidth NOTIFY imageWidthChanged)
              Q_PROPERTY(bool play READ play WRITE setPlay NOTIFY playChanged)
              public:
              explicit openCVCamera(QQuickItem *parent = 0);
              openCVCamera(openCVCamera const&)=delete;
              openCVCamera& operator=(openCVCamera const&)=delete;

              int imageHeight();
              int imageWidth();
              
              void paint(QPainter *painter);
              bool play() const;
              
              void setImageHeight(int value);
              void setImageWidth(int value);
              void setPlay(bool value);
              

              signals:
              void imageHeightChanged();
              void imageWidthChanged();

              void playChanged();
              

              public slots:
              void open(size_t index);

              private slots:
              void captureFrame();

              private:
              cv::VideoCapture camera_;
              cv::Mat cameraFrame_;

              cv::Mat displayedFrame_;
              
              int imageHeight_;
              int imageWidth_;
              
              QString log_;
              
              bool play_;
              
              QTimer *timer_;
              

              };

              #endif // OPENCVCAMERA_HPP

              @

              .cpp
              @
              #include <QDebug>

              #include <QPainter>
              #include <QTimer>

              #include <opencv2/core/core.hpp>

              #include "openCVToQt.hpp"

              #include "openCVCamera.hpp"

              openCVCamera::openCVCamera(QQuickItem *parent) :
              QQuickPaintedItem(parent), imageHeight_(320), imageWidth_(480), play_(false), timer_(new QTimer(this))
              {
              open(0);
              setRenderTarget(QQuickPaintedItem::FramebufferObject);
              setPerformanceHint(QQuickPaintedItem::FastFBOResizing);
              camera_.set(CV_CAP_PROP_FRAME_WIDTH, 480);
              camera_.set(CV_CAP_PROP_FRAME_HEIGHT, 320);
              //setRenderTarget(QQuickPaintedItem::Image);

              connect(timer_, &QTimer::timeout, this, &openCVCamera::captureFrame);
              timer_->start(33);
              

              }

              int openCVCamera::imageHeight()
              {
              return imageHeight_;
              }

              int openCVCamera::imageWidth()
              {
              return imageWidth_;
              }

              void openCVCamera::open(size_t index)
              {
              camera_.open(index);
              if(!camera_.isOpened()){
              log_ = "could not access the camera or video";
              qDebug() << log_;
              }
              }

              void openCVCamera::paint(QPainter *painter)
              {
              if(cameraFrame_.empty()){
              log_ = "could not grab the camera frame";
              qDebug() << log_;
              return;
              }
              cv::resize(cameraFrame_, cameraFrame_, cv::Size(imageWidth_, imageHeight_));
              QImage const img = mat_to_qimage_ref(cameraFrame_);
              painter->drawImage(0, 0, img);
              }

              bool openCVCamera::play() const
              {
              return play_;
              }

              void openCVCamera::setImageHeight(int value)
              {
              if(value != imageHeight()){
              imageHeight_ = value;
              qDebug()<<"height changed : "<<value;
              emit imageHeightChanged();
              }
              }

              void openCVCamera::setImageWidth(int value)
              {
              if(value != imageWidth()){
              imageWidth_ = value;
              qDebug()<<"width changed : "<<value;
              emit imageWidthChanged();
              }
              }

              void openCVCamera::setPlay(bool value)
              {
              if(value != play_){
              play_ = value;

                  emit playChanged();
              }
              

              }

              /**********************************************************
              ****************** implementation ************************
              **********************************************************/

              void openCVCamera::captureFrame()
              {
              if(play_){
              camera_ >> cameraFrame_;
              if(cameraFrame_.empty()){
              log_ = "could not grab the camera frame";
              qDebug() << log_;
              return;
              }
              update();
              }
              }
              @

              Whatever, the speed is slower than QtMultimedia

              1 Reply Last reply
              0
              • M Offline
                M Offline
                Moster
                wrote on last edited by
                #7

                Its just a simple project to test if it works. I basically just extended some opencv example. Im using a tegra3 device. So I got a modified opencv version for the tegra3. You would need to adjust the pro file for your opencv version

                I have to say that Im also pretty new to Qt :P

                main.cpp
                @#include <QApplication>
                #include "Window.h"

                int main(int argc, char** argv){
                QApplication app (argc, argv);

                Window window;
                window.showMaximized();
                
                return app.exec&#40;&#41;;
                

                }
                @

                Window.cpp

                @#include "Window.h"

                Window::Window(QWidget *parent) :
                QWidget(parent)
                {
                scene = new QGraphicsScene(this);

                view = new QGraphicsView(scene, this);
                view->setViewport(new QGLWidget);
                
                //view->setFixedSize(640,480);
                view->setScene(scene);
                 view->showMaximized();
                
                QThread* thread = new QThread;
                Worker* worker = new Worker();
                worker->moveToThread(thread);
                
                connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
                connect(thread, SIGNAL(started()), worker, SLOT(process()));
                connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
                connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
                connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
                connect(worker, SIGNAL(sendPicture(QImage*, Mat*)), this, SLOT(updateScene(QImage*, Mat*)));
                thread->start();
                

                }

                void Window::updateScene(QImage result, Mat help){

                scene->clear();
                scene->addPixmap(QPixmap::fromImage(*result));
                
                delete(result);
                delete(help);
                

                }

                Worker::Worker() {

                 capture = new cv::VideoCapture(0);
                 cv::Size camera_resolution;
                 camera_resolution.width=640;
                 camera_resolution.height=480;
                
                 capture->set(CV_CAP_PROP_FRAME_WIDTH, camera_resolution.width);
                 capture->set(CV_CAP_PROP_FRAME_HEIGHT, camera_resolution.height);
                

                }

                Worker::~Worker(){
                capture->release();

                }

                void Worker::process(){

                 float fps = 0;
                
                  queue<int64> time_queue;
                
                  while(1){
                        int64 then;
                        int64 now = cv::getTickCount();
                        time_queue.push(now);
                
                        // help = new Mat();
                        drawing_frame = new Mat();
                        if (!capture.empty())
                        {
                
                            if (capture->grab())
                                capture->retrieve(*drawing_frame, CV_CAP_ANDROID_GREY_FRAME);
                
                
                            char buffer[256];
                            sprintf(buffer, "Display performance: %dx%d fps: %.3f", drawing_frame->cols, drawing_frame->rows, fps);           
                            cv::putText(*drawing_frame, std::string(buffer), cv::Point(0,32), cv::FONT_HERSHEY_PLAIN, 0.75, cv::Scalar(0,255,0,255));
                        }
                
                        if (time_queue.size() >= 2)
                            then = time_queue.front();
                        else
                            then = 0;
                
                        if (time_queue.size() >= 25)
                            time_queue.pop();
                
                        fps = time_queue.size() * (float)cv::getTickFrequency() / (now-then);
                
                
                        img = new QImage((uchar*)drawing_frame->data, drawing_frame->cols, drawing_frame->rows, drawing_frame->step,QImage::Format_Indexed8);
                
                
                        emit sendPicture(img, drawing_frame);        
                
                
                }
                

                }
                @

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  Moster
                  wrote on last edited by
                  #8

                  Window.h

                  @#ifndef WINDOW_H
                  #define WINDOW_H

                  #include "helper.h"

                  class QGraphicsView;
                  class QGraphicsScene;
                  class QGraphicsPixmapItem;

                  class Window : public QWidget
                  {
                  Q_OBJECT
                  public:
                  explicit Window(QWidget parent = 0);
                  public slots:
                  void updateScene(QImage
                  img, Mat* help);
                  private:
                  QGraphicsView *view;
                  QGraphicsScene scene;
                  QGraphicsPixmapItem
                  item;

                  };

                  class Worker : public QObject {
                  Q_OBJECT
                  cv::Ptrcv::VideoCapture capture;
                  QImage *img;
                  Mat *drawing_frame;
                  public:
                  Worker();
                  ~Worker();

                  public slots:
                  void process();

                  signals:
                  void finished();
                  void error(QString err);
                  void sendPicture(QImage* img, Mat* help);
                  };

                  #endif // WINDOW_H@

                  helper.h

                  @#ifndef HELPER_H
                  #define HELPER_H
                  #define _USE_MATH_DEFINES

                  #include <math.h>
                  #include <jni.h>
                  #include <errno.h>
                  #include <sys/time.h>
                  #include <time.h>
                  #include <queue>
                  #include <vector>

                  #include <QGraphicsScene>
                  #include <QGraphicsView>
                  #include <QImage>
                  #include <QWidget>
                  #include <QObject>
                  #include <QThread>
                  #include <QPixmap>
                  #include <QGLWidget>

                  #include <android/log.h>

                  #include <opencv2/imgproc/imgproc.hpp>
                  #include <opencv2/highgui/highgui.hpp>

                  #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,VA_ARGS)
                  #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,VA_ARGS)
                  #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,VA_ARGS)
                  #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,VA_ARGS)

                  using namespace std;
                  using namespace cv;

                  #endif // HELPER_H@

                  project file: cam.pro

                  @TEMPLATE = app
                  TARGET = cam

                  QT = opengl core widgets gui

                  OTHER_FILES +=
                  android/version.xml
                  android/src/org/qtproject/qt5/android/bindings/QtActivity.java
                  android/src/org/qtproject/qt5/android/bindings/QtApplication.java
                  android/src/org/kde/necessitas/ministro/IMinistro.aidl
                  android/src/org/kde/necessitas/ministro/IMinistroCallback.aidl
                  android/res/values-el/strings.xml
                  android/res/values-nb/strings.xml
                  android/res/values-zh-rCN/strings.xml
                  android/res/values-id/strings.xml
                  android/res/values-ja/strings.xml
                  android/res/values-zh-rTW/strings.xml
                  android/res/values-de/strings.xml
                  android/res/values-fr/strings.xml
                  android/res/values-pl/strings.xml
                  android/res/values-ro/strings.xml
                  android/res/values-it/strings.xml
                  android/res/values-es/strings.xml
                  android/res/values-pt-rBR/strings.xml
                  android/res/values-fa/strings.xml
                  android/res/layout/splash.xml
                  android/res/values-rs/strings.xml
                  android/res/values-ms/strings.xml
                  android/res/values-et/strings.xml
                  android/res/values/strings.xml
                  android/res/values/libs.xml
                  android/res/values-nl/strings.xml
                  android/res/values-ru/strings.xml
                  android/AndroidManifest.xml

                  INCLUDEPATH += $$PWD/../../../NVPACK/OpenCV-2.4.5-Tegra-sdk/sdk/native/jni/include/opencv/
                  INCLUDEPATH += $$PWD/../../../NVPACK/OpenCV-2.4.5-Tegra-sdk/sdk/native/jni/include/opencv2/
                  INCLUDEPATH += $$PWD/../../../NVPACK/OpenCV-2.4.5-Tegra-sdk/sdk/native/jni/include/
                  INCLUDEPATH += $$PWD/../../../NVPACK/android-ndk-r8d/sources/android/native_app_glue

                  LIBS += -L$$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/lib/ -landroid

                  INCLUDEPATH += $$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/include/android
                  DEPENDPATH += $$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/include/android

                  LIBS += -L$$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/lib/ -lEGL

                  INCLUDEPATH += $$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/include/EGL
                  DEPENDPATH += $$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/include/EGL

                  LIBS += -L$$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/lib/ -lGLESv2

                  INCLUDEPATH += $$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/include/GLES2
                  DEPENDPATH += $$PWD/../../../NVPACK/android-ndk-r8d/platforms/android-14/arch-arm/usr/include/GLES2

                  LIBS += -L$$PWD/../../../NVPACK/OpenCV-2.4.5-Tegra-sdk/sdk/native/libs/tegra3/
                  -lopencv_contrib
                  -lopencv_legacy
                  -lopencv_ml
                  -lopencv_stitching
                  -lopencv_objdetect
                  -lopencv_videostab
                  -lopencv_calib3d
                  -lopencv_photo
                  -lopencv_video
                  -lopencv_features2d
                  -lopencv_highgui
                  -lopencv_androidcamera
                  -lopencv_flann
                  -lopencv_imgproc
                  -lopencv_core

                  LIBS += -L$$PWD/../../../NVPACK/OpenCV-2.4.5-Tegra-sdk/sdk/native/3rdparty/libs/tegra3/
                  -ltbb
                  -llibjpeg
                  -llibpng
                  -llibtiff
                  -llibjasper
                  -lIlmImf

                  SOURCES +=
                  main.cpp
                  Window.cpp

                  HEADERS +=
                  helper.h
                  Window.h
                  @

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    stereomatching
                    wrote on last edited by
                    #9

                    Thanks for your codes:). Maybe you could use smart pointer
                    (unique_ptr) to guard your resources, this could make your codes
                    become safer and more robust(there are a lot of articles explain how
                    important smart pointer(RAII) in c++).

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      Moster
                      wrote on last edited by
                      #10

                      Thanks for the hint :) Im pretty new to c++, too.
                      So Im still learning stuff. Im going to check this out

                      1 Reply Last reply
                      0
                      • kybernetesK Offline
                        kybernetesK Offline
                        kybernetes
                        wrote on last edited by
                        #11

                        what about alarm clock?

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved