Android Camera on QT5.12 Opencv4android4.3 c++
-
HI,
I managed to put all together to build android apps on QTCreator with Opencv for Android, but now,
I'm trying get camera image throw opencv using c++ but I have no idea how to do it.
I look to a bunch of tutorials but all are in java and the ones in c++ are not complete.this is my code:
cout << "Opening camera..." << endl; VideoCapture capture(0); // open the first camera if (!capture.isOpened()) { ui->label->setText("Failed"); } else { ui->label->setText("Working"); }
It returns always true (failed).
why what i'm missing?
Any help? -
!!!...UPDATE...!!!
Some times the better is restart, this is what i did!
I restart from the bottom by configuring QT Creator
configure qt for androidNow it's building everything...really everything....all QT samples I piped in they work 80 or 90 percent in Android
PS: I'm targeting the samples not designed for Android, I'm targeting all samples without "Android" in the green tags.
For example the sample "Qt Quick Extras - Dashboard" with the kit QT 5.13.0 and it worked 100%
Next stop Rebuilding Opencv4Android....
-
Hi @jsulm thanks for reply.
I add thins to my manifest file:
<uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/> <uses-feature android:name="android.hardware.camera.front" android:required="true"/> <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="true"/>
but the app didn't ask for permissions and I still can't get the camera image so I add this code in my mainwindow.cpp
auto result = QtAndroid::checkPermission(QString("android.permission.CAMERA")); if(result == QtAndroid::PermissionResult::Denied){ QtAndroid::PermissionResultMap resultHash = QtAndroid::requestPermissionsSync(QStringList({"android.permission.CAMERA"})); if(resultHash["android.permission.CAMERA"] == QtAndroid::PermissionResult::Denied) { } }
still no camera image, when i check
if (!capture.isOpened())
It return "Not opened"
This is my full Manifest.xml
<?xml version="1.0"?> <manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="-- %%INSERT_VERSION_NAME%% --" android:versionCode="-- %%INSERT_VERSION_CODE%% --" android:installLocation="auto"> <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="28"/> <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application. Remove the comment if you do not require these default permissions. --> <!-- %%INSERT_PERMISSIONS --> <uses-permission android:name="android.permission.CAMERA"/> <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application. Remove the comment if you do not require these default features. --> <!-- %%INSERT_FEATURES --> <uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/> <uses-feature android:name="android.hardware.camera.front" android:required="true"/> <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="true"/> <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/> <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --"> <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <!-- Application arguments --> <!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ --> <!-- Application arguments --> <meta-data android:name="android.app.lib_name" android:value="MyFirstQT_Android_APP"/> <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/> <meta-data android:name="android.app.repository" android:value="default"/> <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/> <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/> <!-- Deploy Qt libs as part of package --> <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/> <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/> <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/> <!-- Run with local libs --> <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/> <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/> <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/> <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/> <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/> <!-- Used to specify custom system library path to run with local system libs --> <!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> --> <!-- Messages maps --> <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/> <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/> <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/> <meta-data android:value="@string/unsupported_android_version" android:name="android.app.unsupported_android_version"/> <!-- Messages maps --> <!-- Splash screen --> <!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation, then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you are done populating your window with content. --> <!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / --> <!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / --> <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ --> <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ --> <!-- Splash screen --> <!-- Background running --> <!-- Warning: changing this value to true may cause unexpected crashes if the application still try to draw after "applicationStateChanged(Qt::ApplicationSuspended)" signal is sent! --> <meta-data android:name="android.app.background_running" android:value="false"/> <!-- Background running --> <!-- auto screen scale factor --> <meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/> <!-- auto screen scale factor --> <!-- extract android style --> <!-- available android:values : * default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons * full - useful QWidget & Quick Controls 1 apps * minimal - useful for Quick Controls 2 apps, it is much faster than "full" * none - useful for apps that don't use any of the above Qt modules --> <meta-data android:name="android.app.extract_android_style" android:value="default"/> <!-- extract android style --> </activity> <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices --> </application> <uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/> <uses-feature android:name="android.hardware.camera.front" android:required="true"/> <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="true"/> </manifest>
This is my full mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include <camera/NdkCameraCaptureSession.h> #include <camera/NdkCameraDevice.h> #include <camera/NdkCameraError.h> #include <camera/NdkCameraManager.h> #include <camera/NdkCameraMetadata.h> #include <camera/NdkCameraMetadataTags.h> //#include <camera/NdkCameraWindowType.h> #include <camera/NdkCaptureRequest.h> //http://hxr99.blogspot.com/2011/12/opencv-examples-camera-capture.html #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core.hpp> #include "opencv2/opencv.hpp" #include <opencv2/core/mat.hpp> #include <opencv2/core/mat.inl.hpp> #include <opencv2/core.hpp> #include <opencv2/videoio.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> // cv::Canny() #include <iostream> using namespace cv; using std::cout; using std::cerr; using std::endl; #include <jni.h> #include <string> #include <opencv2/core.hpp> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; #include <QtAndroidExtras/QtAndroid> #include <QtAndroidExtras/QtAndroid> #include <QtMultimedia/qmultimedia.h> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); auto result = QtAndroid::checkPermission(QString("android.permission.CAMERA")); if(result == QtAndroid::PermissionResult::Denied){ QtAndroid::PermissionResultMap resultHash = QtAndroid::requestPermissionsSync(QStringList({"android.permission.CAMERA"})); if(resultHash["android.permission.CAMERA"] == QtAndroid::PermissionResult::Denied) { } } //Mat frame; cout << "Opening camera..." << endl; VideoCapture capture(1099); // open the first camera if (!capture.isOpened()) { ui->label->setText("Failed"); } else { ui->label->setText("Working"); } } MainWindow::~MainWindow() { delete ui; }
-
!!!...UPDATE...!!!
Some times the better is restart, this is what i did!
I restart from the bottom by configuring QT Creator
configure qt for androidNow it's building everything...really everything....all QT samples I piped in they work 80 or 90 percent in Android
PS: I'm targeting the samples not designed for Android, I'm targeting all samples without "Android" in the green tags.
For example the sample "Qt Quick Extras - Dashboard" with the kit QT 5.13.0 and it worked 100%
Next stop Rebuilding Opencv4Android....