2017-09-16 5 views
0

J'essaie de créer une application où je pointerai mon appareil photo vers quelque chose et l'application affichera la couleur rouge bleu et vert de l'objet. Je développe l'application dans le studio android en utilisant la bibliothèque OpenCV. J'ai réussi tous les paramètres et peut convertir l'espace de couleur de la vidéo en direct. Cependant, je ne peux pas afficher les valeurs R, G et B séparément. Pour être honnête, je n'ai aucune idée de comment le faire.J'ai fait google search et j'ai reçu de l'aide en C++, mais je n'ai pas trouvé beaucoup d'aide pour java.Afficher les valeurs Red Blue et Green séparément en utilisant OpenCV pour l'application Android

mon fichier d'activité est ce

package com.example.virus.bloodpressurereader; 
import android.hardware.Camera; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.SurfaceView; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase; 
import org.opencv.android.JavaCameraView; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.dnn.Importer; 
import org.opencv.imgproc.Imgproc; 

public class VideoRecordingActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{ 

//custom toolbar 
private Toolbar toolbar; 

//java camera view 
JavaCameraView javaCameraView; 

Mat mRgba, rgb_scale; 


//callback loader 
BaseLoaderCallback mCallBackLoader = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 


     switch (status){ 
      case BaseLoaderCallback.SUCCESS: 
       javaCameraView.enableView(); 
       break; 
      default: 
       super.onManagerConnected(status); 
       break; 
     } 
    } 
}; 


public static String TAG="VideoRecordingActivity"; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_video_recording); 

    //custom toolbar 
    toolbar = (Toolbar)findViewById(R.id.nav_action); 
    setSupportActionBar(toolbar); 


    //connect the camera 
    javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view); 

    //set visibility 
    javaCameraView.setVisibility(SurfaceView.VISIBLE); 
    //set callback function 
    javaCameraView.setCvCameraViewListener(this); 


} 

@Override 
protected void onPause() { 
    super.onPause(); 

    if(javaCameraView!=null){ 
     javaCameraView.disableView(); 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (javaCameraView!=null){ 
     javaCameraView.disableView(); 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    if (OpenCVLoader.initDebug()){ 
     Log.d(TAG, "Connected"); 

     //display when the activity resumed,, callback loader 
     mCallBackLoader.onManagerConnected(LoaderCallbackInterface.SUCCESS); 


    }else{ 
     Log.d(TAG, "Not connected"); 
     OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_3_0, this, mCallBackLoader); 
    } 
} 

@Override 
public void onCameraViewStarted(int width, int height) { 
    //4 channel 
    mRgba = new Mat(height, width, CvType.CV_8UC4); 
    //rgb_scale = new Mat(height, width, CvType.CV_8UC1); 
} 

@Override 
public void onCameraViewStopped() { 
    //release 
    mRgba.release(); 
} 

@Override 
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 
    //get each frame from camera\ 
    mRgba = inputFrame.rgba(); 

    //Imgproc.cvtColor(mRgba, rgb_scale, Imgproc.COLOR_RGB2HSV); 

    return mRgba; 
} 
} 

Note: Je n'ai pas les textviews à afficher le bleu et le vert rouge comme je veux juste enregistrer les valeurs hors.

+0

vérifier cela peut vous aider: https://stackoverflow.com/q/44017224/4146722 –

+0

Merci pour la suggestion. Je suis actuellement dehors. Une fois que je reçois et je vais passer par là .. – Mill3r

+0

le lien que vous m'avez fourni n'a pas aidé réellement. J'essaie de contourner cela depuis longtemps maintenant. La question dans le lien fonctionne d'une manière ou d'une autre pour donner les valeurs de rgb mais le taux de trame tombe à 2fps. Je ne pouvais pas le faire fonctionner au-delà de ça. – Mill3r

Répondre

0
public class VideoRecordingActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{ 

//custom toolbar 
private Toolbar toolbar; 

//java camera view 
JavaCameraView javaCameraView; 

Mat mRgba, mHsv; 

//callback loader 
BaseLoaderCallback mCallBackLoader = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 


     switch (status){ 
      case BaseLoaderCallback.SUCCESS: 
       javaCameraView.enableView(); 
       break; 
      default: 
       super.onManagerConnected(status); 
       break; 
     } 
    } 
}; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_video_recording); 

    //custom toolbar 
    toolbar = (Toolbar)findViewById(R.id.nav_action); 
    setSupportActionBar(toolbar); 

    //connect the camera 
    javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view); 

    //set visibility 
    javaCameraView.setVisibility(SurfaceView.VISIBLE); 
    javaCameraView.setMaxFrameSize(320, 240); 

    javaCameraView.enableFpsMeter(); 
    javaCameraView.clearFocus(); 

    //set callback function 
    javaCameraView.setCvCameraViewListener(this); 


} 

@Override 
protected void onPause() { 
    super.onPause(); 

    if(javaCameraView!=null){ 
     javaCameraView.disableView(); 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (javaCameraView!=null){ 
     javaCameraView.disableView(); 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    if (OpenCVLoader.initDebug()){ 
     Log.d("openCV", "Connected"); 

     //display when the activity resumed,, callback loader 
     mCallBackLoader.onManagerConnected(LoaderCallbackInterface.SUCCESS); 


    }else{ 
     Log.d("openCV", "Not connected"); 
     OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_3_0, this, mCallBackLoader); 
    } 
} 

@Override 
public void onCameraViewStarted(int width, int height) { 
    //4 channel 
    mRgba = new Mat(width, height, CvType.CV_8UC4); 
    mHsv = new Mat(width, height, CvType.CV_8UC3); 

} 

@Override 
public void onCameraViewStopped() { 
    //release 
    mRgba.release(); 
} 

@Override 
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 
    //get each frame from camera 
    mRgba = inputFrame.rgba(); 


    /**********HSV conversion**************/ 
    //convert mat rgb to mat hsv 
    Imgproc.cvtColor(mRgba, mHsv, Imgproc.COLOR_RGB2HSV); 

    //find scalar sum of hsv 
    Scalar mColorHsv = Core.sumElems(mHsv); 

    int pointCount = 320*240; 


    //convert each pixel 
    for (int i = 0; i < mColorHsv.val.length; i++) { 
     mColorHsv.val[i] /= pointCount; 
    } 

    //convert hsv scalar to rgb scalar 
    Scalar mColorRgb = convertScalarHsv2Rgba(mColorHsv); 

    /*Log.d("intensity", "Color: #" + String.format("%02X", (int)mColorHsv.val[0]) 
      + String.format("%02X", (int)mColorHsv.val[1]) 
      + String.format("%02X", (int)mColorHsv.val[2]));*/ 
    //print scalar value 
    //Log.d("intensity", "R:"+ String.valueOf(mColorRgb.val[0])+" G:"+String.valueOf(mColorRgb.val[1])+" B:"+String.valueOf(mColorRgb.val[2])); 


    /*Convert to YUV*/ 

    int R = (int) mColorRgb.val[0]; 
    int G = (int) mColorRgb.val[1]; 
    int B = (int) mColorRgb.val[2]; 

    int Y = (int) (R * .299000 + G * .587000 + B * .114000); 
    int U = (int) (R * -.168736 + G * -.331264 + B * .500000 + 128); 
    int V = (int) (R * .500000 + G * -.418688 + B * -.081312 + 128); 

    //int I = (R+G+B)/3; 


    //Log.d("intensity", "I: "+String.valueOf(I)); 
    //Log.d("intensity", "Y:"+ String.valueOf(Y)+" U:"+String.valueOf(U)+" V:"+String.valueOf(V)); 

    /*calibration*/ 


    return mRgba; 

} 



//convert Mat hsv to scalar 
private Scalar convertScalarHsv2Rgba(Scalar hsvColor) { 
    Mat pointMatRgba = new Mat(); 
    Mat pointMatHsv = new Mat(1, 1, CvType.CV_8UC3, hsvColor); 
    Imgproc.cvtColor(pointMatHsv, pointMatRgba, Imgproc.COLOR_HSV2RGB); 

    return new Scalar(pointMatRgba.get(0, 0)); 
} 
}