user1874406
user1874406

Reputation: 71

mixChannels() giving exception in opencv android

I am writing function to find rectangles in Mat. But i am getting exception at mixChannels()function. My code is as follow. Can some one check and tell me what could be wrong in it ?I would also like to know how i can implement gray = gray0 >= (l+1)*255/N; in java or android ?

private void findSqaures(Mat sourceImage){
        Vector<Point> sqares;
        Mat pyr,timing ,gry =new Mat();
        pyr=new Mat(sourceImage.size(),CvType.CV_8U);
        timing=new Mat(sourceImage.size(),CvType.CV_8U);
        int thresh = 50, N = 11;
        List<Mat> grayO=new ArrayList<Mat>();
        List<Mat> timing1=new ArrayList<Mat>();
        Imgproc.pyrDown(sourceImage, pyr,new Size(sourceImage.cols()/2.0, sourceImage.rows()/2));
        Imgproc.pyrUp(pyr, timing,sourceImage.size());
//      Vector<Point> contours=new Vector<Point>();
        timing1.add(0,pyr);
        grayO.add(0,timing);
//      grayO.add(0,timing);
        for(int c=0;c<3;c++){
            int ch[]={1,0};

            MatOfInt fromto = new MatOfInt(ch);
            Core.mixChannels(timing1, grayO, fromto); // Getting Exception here
//          Core.mixChannels(src, dst, fromTo)
            for(int i=0;i<N;i++){
                Mat output=grayO.get(0);
                if(i==0){

                    Imgproc.Canny(output, gry, 5, thresh);
                    Imgproc.dilate(gry, gry, new Mat(), new Point(-1,-1), 1);
                }
                 else { 
//                   output = output >= (i+1)*255/N;
                   }
//              sourceImage=gry;
                contours=new ArrayList<MatOfPoint>();
                Imgproc.findContours(gry, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
                 MatOfPoint2f approxCurve = new MatOfPoint2f();
                 mDrawnContours.clear();
                 Log.i(TAG, "::findSqaures:" + "contours.size():"+contours.size());
                for(int j=0;i<contours.size();j++){
                    MatOfPoint tempContour=contours.get(i);
                    MatOfPoint2f newMat = new MatOfPoint2f( tempContour.toArray() );
                    int contourSize = (int)tempContour.total();

                    Imgproc.approxPolyDP(newMat, approxCurve, contourSize*0.02, true);
                    MatOfPoint points=new MatOfPoint(approxCurve.toArray());
//                    if( approx.size() == 4 && fabs(contourArea(cv::Mat(approx))) > 1000 && cv::isContourConvex(cv::Mat(approx))) {
                    if(points.toArray().length==4 && (Math.abs(approxCurve.total())>1000) && Imgproc.isContourConvex(points)){
                        double maxCosine=0;
                        int k;
                        for( k=2;k<5;k++){
                            double cosine=Math.abs(angle(points.toArray()[k%4], points.toArray()[k-2], points.toArray()[k-1]));
                            if(maxCosine>cosine){
                                maxCosine=cosine;
                            }
                        }
                        Log.i(TAG, "::findSqaures:" + "maxCosine:"+maxCosine);
                        if(maxCosine<0.3){
                            DrawnContours drawnContours=new DrawnContours();
                            drawnContours.setIndex(k);
                            mDrawnContours.add(drawnContours);

                        }

                    }

                }
                Log.i(TAG, "::findSqaures:" + "mDrawnContours.size():"+mDrawnContours.size());
            }
        }


//      Core.mixChannels(src, dst, fromTo)

    }

The exception is *CvException [org.opencv.core.CvException: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/matrix.cpp:3210: error: (-215) A.size == arrays[i0]->size in function void cv::NAryMatIterator::init(const cv::Mat, cv::Mat*, uchar*, int)**

Upvotes: 0

Views: 2899

Answers (2)

user3302199
user3302199

Reputation: 61

From

Core.mixChannels(timing1, grayO, fromto); 

element of gray0 array and timing1 array should have the same size. but pyr has half the size of timing so you've got an error.

Look again at the sample squares.cpp

  1. source of mixChannels function should be the result Mat of pyrUp function
  2. destination of mixChannels function should be a new empty Mat with the same size.

So, correct it with :

timing1.add(0,timing); // or timing1.add(timing)
grayO.add(0, new Mat(timing.size(), timing.type()) );

Regards, Louis

Upvotes: 1

Siva
Siva

Reputation: 11

Instead of the following timing1.add(0,pyr); grayO.add(0,timing);

Try this

timing1.add(pyr);
grayO.add(timing);

Instead of the below line

gry = output >= (i+1)*255/N;

You could use

Imgproc.threshold(output, gry, (l+1) * 255 / N, 255, Imgproc.THRESH_BINARY);

Also instead of using the pyr as the source, blur the image using medianBlur function, you would get better rectangle identification.

Upvotes: 1

Related Questions