How to int array

hi forum anyone could help me how to change following code

int lowerb = 100;
int upperb = 145;

into this

int lowerb = ([100,0,0]);
int upperb = ([255,80,255]);

below is complete code

import gab.opencv.*;
import processing.video.*;
PImage src, colorFilteredImage;
OpenCV opencv;
Movie video;
int lowerb = 100;//80,100
int upperb = 145;//148
Histogram histogram;

// movie used:
// https://github.com/processing/processing-video/raw/main/examples/Movie/Speed/data/launch2.mp4

int count;

void setup() 
  {
  size(1120, 406);
  
  video = new Movie(this, "launch2.mp4");
  println(video.width, video.height);
  
  video.loop();
  while(video.width <=0)
    {
    delay(1);
    }
  println(video.width, video.height);
  
  opencv = new OpenCV(this, video.width, video.height);
  
  while(opencv.width<=0)
    {
    delay(1);  
    }
  println(opencv.width, opencv.height);  
  }

void draw() 
  {
  image(video, 0, 0);
  
  opencv.loadImage(video);
  opencv.useColor(HSB);
  opencv.setGray(opencv.getH().clone());
  opencv.inRange(lowerb, upperb);
  histogram = opencv.findHistogram(opencv.getH(), 255);
  image(opencv.getOutput(), video.width, 0);
  }

void movieEvent(Movie m) 
  {
  m.read();
  }

thank you.

Hi

It looks like inRange() takes integers, not integer triples (or arrays). So you only want to pass it two single integer values.

i know but in the source it receive scalar

public void inRange(int lowerBound, int upperBound){
		Core.inRange(getCurrentMat(), new Scalar(lowerBound), new Scalar(upperBound), getCurrentMat());
	}

as far as i know scalar could be written as follow

Scalar lowerb = new Scalar (0,0,0)

Looking at https://docs.opencv.org/3.4/javadoc/org/opencv/core/Scalar.html, it looks like their Scalar class takes doubles in the constructor, so you could have

double[] lowerbnd = { 100, 0, 0 };
double[] upperbnd = { 255, 80, 255 };

Scalar lowerb;
Scalar upperb;

void setup() {

  lowerb = new Scalar( lowerbnd );
  upperb = new Scalar( upperbnd );
}

but recognize that you’ll have to call the Core.inRange() version of the function yourself. The gab wrapper only takes a single int and not a Scalar.

its error with

Type mismatch: cannot convert from Scalar to double

Okay please show your code.

It’s

  • lowerb
  • upperb

btw.

import org.opencv.core.Core;
import gab.opencv.*;
import processing.video.*;
PImage src, colorFilteredImage;
import org.opencv.core.Scalar;
import org.opencv.core.Mat;
OpenCV opencv;
Movie video;
//int lowerb = 100;//80,100
//int upperb = 145;//

double[] lowerbnd = { 100, 0, 0 };
double[] upperbnd = { 255, 80, 255 };
Histogram histogram;
void setup() {
  size(1136, 320);
  video = new Movie(this, "vid1.mp4");//1
   opencv = new OpenCV(this, 568, 320);
    lowerbnd = new Scalar( lowerbnd );
  upperbnd = new Scalar( upperbnd );
  
  video.loop();
  video.play();
}

void draw() {

  if (video.width == 0 || video.height == 0)
    return;
            opencv.loadImage(video);
            opencv.useColor(HSB);
            image(video, 0, 0);
            //opencv.useColor(HSB); able to display the result but strange image
            opencv.setGray(opencv.getH().clone());
            opencv.inRange(lowerbnd, upperbnd);
            histogram = opencv.findHistogram(opencv.getH(), 255);
            //opencv.useColor(HSB);// this not work
            // translate(video.width, 0);
            image(opencv.getOutput(), video.width, 0);
}
void movieEvent(Movie m) 
  {
  m.read();
  }

opencv.inRange() takes two ints. You can’t give it anything other than two ints.

Its code, however, calls Core.inRange() which takes different parameters. You need to call that function if you want to pass it Scalar objects. I’m not sure how you would go about doing so though.

just for completeness:

remember that scudly had

double[] lowerbnd = { 100, 0, 0 };
double[] upperbnd = { 255, 80, 255 };

Scalar lowerb;
Scalar upperb;

and

  lowerb = new Scalar( lowerbnd );
  upperb = new Scalar( upperbnd );

Where you have

  lowerbnd = new Scalar( lowerbnd );
  upperbnd = new Scalar( upperbnd );

can’t work this way.

You need lowerb and upperb.

actually i succeed in android studio just to filter white image with this code, and just want to try in processing

public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener2 {

    private static final String TAG = "OCVSample::Activity";
    private int w, h;
    private CameraBridgeViewBase mOpenCvCameraView;
    TextView tvName;
    Scalar sc1 = new Scalar(80, 0, 0);
    Scalar sc2 = new Scalar(250, 160, 250);
    int iLowH = 80;
    int iHighH = 255;
    int iLowS = 0;
    int iHighS = 160;
    int iLowV = 0;
    int iHighV = 255;

    Mat mRgba, imgHSV, imgThreshold, fit;
    Scalar sc1,sc2;

    static {
        if (!OpenCVLoader.initDebug())
            Log.d("ERROR", "Unable to load OpenCV");
        else
            Log.d("SUCCESS", "OpenCV loaded");
    }

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS: {
                    Log.i(TAG, "OpenCV loaded successfully");
                    mOpenCvCameraView.enableView();
                }
                break;
                default: {
                    super.onManagerConnected(status);
                }
                break;
            }
        }
    };
    public void onCameraViewStopped() {
    }

    public void onCameraViewStarted(int width, int height) {
        imgHSV = new Mat(width,height, CvType.CV_16UC4);
        imgThreshold = new Mat(width,height, CvType.CV_16UC4);
    }

    public MainActivity() {

        Log.i(TAG, "Instantiated new " + this.getClass());
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {

        Log.i(TAG, "called onCreate");
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_main);
        mOpenCvCameraView = (CameraBridgeViewBase)findViewById(R.id.display);
        mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraView.setCvCameraViewListener(this);
        mOpenCvCameraView.enableView();
        sc1 = new Scalar(iLowH,iLowS,iLowV);
        sc2 = new Scalar(iHighH,iHighS,iHighV);
    }
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        Imgproc.cvtColor(inputFrame.rgba(), imgHSV, Imgproc.COLOR_BGR2HSV);
        Core.inRange(imgHSV,sc1,sc2,imgThreshold);
        return  imgThreshold;
    }
}

i try this but still the opencv.inRange(); expects (int,int);

import org.opencv.core.Core;
import gab.opencv.*;
import processing.video.*;
PImage src, colorFilteredImage;
import org.opencv.core.Scalar;
import org.opencv.core.Mat;
OpenCV opencv;
Movie video;
//int lowerb = 100;//80,100
//int upperb = 145;//
Scalar lowerb;
Scalar upperb;

double[] lowerbnd = { 100, 0, 0 };
double[] upperbnd = { 255, 80, 255 };
Histogram histogram;
void setup() {
  size(1136, 320);
  video = new Movie(this, "vid1.mp4");//1
   opencv = new OpenCV(this, 568, 320);
    lowerb = new Scalar( lowerbnd );
  upperb = new Scalar( upperbnd );
  
  video.loop();
  video.play();
}

void draw() {

  if (video.width == 0 || video.height == 0)
    return;
            opencv.loadImage(video);
            opencv.useColor(HSB);
            image(video, 0, 0);
            //opencv.useColor(HSB); able to display the result but strange image
            opencv.setGray(opencv.getH().clone());
            opencv.inRange(lowerb, upperb);
            histogram = opencv.findHistogram(opencv.getH(), 255);
            //opencv.useColor(HSB);// this not work
            // translate(video.width, 0);
            image(opencv.getOutput(), video.width, 0);
}
void movieEvent(Movie m) 
  {
  m.read();
  }
1 Like

I can’t help you with this

1 Like