2016-08-04 21 views
1

私は輪郭を見つけて境界を修正し、それを私のプロジェクトで表示しました。私は最大の輪郭を見つけてそれを表示したいと思います。これは可能ですか?私はOpenCV Java Langの初心者です。java opencvで最大の輪郭を見つける方法

HERESにこれまでの私のコード:

@Override 
public void onCameraViewStarted(int width, int height) { 
    mRgba = new Mat(height, width, CvType.CV_8UC4); 
    mHsv = new Mat(height,width,CvType.CV_8UC3); 
    hierarchy = new Mat(); 
    mHsvMask = new Mat(); 
    mDilated = new Mat(); 
    mEroded = new Mat(); 
} 

@Override 
public void onCameraViewStopped() { 
    mRgba.release(); 
    mHsv.release(); 
    mHsvMask.release(); 
    mDilated.release(); 
    hierarchy.release(); 

} 

@Override 
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 

    mRgba =inputFrame.rgba(); 
    contours = new ArrayList<MatOfPoint>(); 
    hierarchy =new Mat(); 
    mHsv = new Mat(); 
    mHsvMask =new Mat(); 

    Imgproc.cvtColor(mRgba, mHsv, Imgproc.COLOR_RGB2HSV); 

    Scalar lowerThreshold = new Scalar (0, 0, 0); // Blue color – lower hsv values 
    Scalar upperThreshold = new Scalar (179, 255, 10); // Blue color – higher hsv values 
    Core.inRange (mHsv, lowerThreshold , upperThreshold, mHsvMask); 

    //just some filter 
    //Imgproc.dilate (mHsvMask, mDilated, new Mat()); 
    //Imgproc.erode(mDilated,mEroded,new Mat()); 


    Imgproc.findContours(mHsvMask, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE); 

    for (int contourIdx=0; contourIdx < contours.size(); contourIdx++) 
    { 
     //Minimun size allowed for consideration 
     MatOfPoint2f approxCurve = new MatOfPoint2f(); 
     MatOfPoint2f contour2f = new MatOfPoint2f(contours.get(contourIdx).toArray()); 

     //Processing on mMOP2f1 which is in type MatOfPoint2f 
     double approxDistance = Imgproc.arcLength(contour2f,true)*0.02; 
     Imgproc.approxPolyDP(contour2f,approxCurve,approxDistance,true); 

     //convert to MatofPoint 
     MatOfPoint point = new MatOfPoint(approxCurve.toArray()); 

     //get boundingrect from contour 
     Rect rect = Imgproc.boundingRect(point); 

     Imgproc.rectangle(mRgba,new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 0, 0, 255),3); 
     //bisa Imgproc.rectangle(mRgba, rect.tl(), rect.br(), new Scalar(255, 0, 0),1, 8,0); 


     //show contour kontur 
     if(Imgproc.contourArea(contours.get(contourIdx))>100) { 
      Imgproc.drawContours(mRgba, contours, contourIdx, new Scalar(0,255,0), 5); 
     } 
    } 
    return mRgba; 

がうまくいけば、誰かがこの中にいくつかの経験を持っています。お返事ありがとう...

+0

はい、それはあなたが最大の輪郭によって何を意味するかより正確に定義することができ、確実に可能ですか?最大の面積を持つ輪郭(白いピクセル)を探したいのか、それとも 'boundingRect()'の最大面積を持つ輪郭だけを必要としますか? – ZdaR

+0

@ ZadR最大の境界線を表示したい。うまくいけば私は私を助けることができる。ソリ、しかし、私はこれで新しいです。 –

答えて

3

機能を使用すると、すべての輪郭の領域を見つけることができ、最大の領域を持つ輪郭が単に最大のものになります。最大の輪郭を描く

コードは次のようになります:

double maxVal = 0; 
int maxValIdx = 0; 
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) 
{ 
    double contourArea = Imgproc.contourArea(contours.get(contourIdx)); 
    if (maxVal < contourArea) 
    { 
     maxVal = contourArea; 
     maxValIdx = contourIdx; 
    } 
} 

Imgproc.drawContours(mRgba, contours, maxValIdx, new Scalar(0,255,0), 5); 
+0

ああ、それは試してみるが、私は最大の矩形領域を見つけたい。 contourAreaではなく、私を助けることができますか? 最大の1つの境界ボックスを表示するにはboundingrectを使用します。 ありがとう –

+0

同様に、境界矩形の最大面積を見つけることができます。すべての長方形を通過し、その高さと幅を掛けて面積を数え、最大のものを見つけます。 –

関連する問題