2017-11-13 9 views
1
if (DETECT_RED_OBJECTS_ONLY) 
    { 
    Imgproc.cvtColor(inputFrame, gray, 
    Imgproc.COLOR_BGR2RGB); 
    } 
    else 
    { 
    Imgproc.cvtColor(inputFrame, gray, Imgproc.COLOR_BGR2GRAY); 
    } 
    Imgproc.cvtColor(inputFrame, dst, Imgproc.COLOR_BGR2RGB); 


    // down-scale and upscale the image to filter out the noise 
    Imgproc.pyrDown(gray, downscaled, new Size(gray.cols()/2, gray.rows() 2)); 
    Imgproc.pyrUp(downscaled, upscaled, gray.size()); 

    if (DETECT_RED_OBJECTS_ONLY) { 
     // convert the image from RGBA to HSV 
     Imgproc.cvtColor(upscaled, hsv, Imgproc.COLOR_RGB2HSV); 
     // threshold the image for the lower and upper HSV red range 
     Core.inRange(hsv, HSV_LOW_RED1, HSV_LOW_RED2, lowerRedRange); 
     Core.inRange(hsv, HSV_HIGH_RED1, HSV_HIGH_RED2, upperRedRange); 
     // put the two thresholded images together 


     Core.addWeighted(lowerRedRange, 1.0, upperRedRange, 1.0, 0.0, bw); 
     // apply canny to get edges only 
     System.out.println(bw); 
     Imgproc.Canny(bw, bw, 0, 255); 
    } else { 
     // Use Canny instead of threshold to catch squares with gradient shading 
     Imgproc.Canny(upscaled, bw, 0, 255); 
    } 


    // dilate canny output to remove potential 
    // holes between edge segments 
    Imgproc.dilate(bw, bw, new Mat(), new Point(-1, 1), 1); 

    // find contours and store them all as a list 
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
    contourImage = bw.clone(); 
    Imgproc.findContours(
      contourImage, 
      contours, 
      hierarchyOutputVector, 
      Imgproc.RETR_EXTERNAL, 
      Imgproc.CHAIN_APPROX_SIMPLE 
    ); 

    System.out.println("contours" + contours); 

    // loop over all found contours 
    for (MatOfPoint cnt : contours) { 
     MatOfPoint2f curve = new MatOfPoint2f(cnt.toArray()); 

     // approximates a polygonal curve with the specified precision 
     Imgproc.approxPolyDP(
       curve, 
       approxCurve, 
       0.02 * Imgproc.arcLength(curve, true), 
       true 
     ); 

     int numberVertices = (int) approxCurve.total(); 

入力画像として三角形を使用すると、この三角形が機能し、三角形を検出します[カウンタは1になり、numberVerticesは3になります]。しかし、私は矩形の画像を入力すると、輪郭は2になり、numberVerticesは2になります。それは4でなければなりません。ではない。誰も私がバグを見つけるのを助けることができますか?opencvのfindContours Java

答えて

0

あなたは、最新のVisual Studioでこれを使用している場合、私はあなたが使用することをお勧め:

JavaList List<MatOfPoint> contours = new JavaList<MatOfPoint>(); 

これはあなたの輪郭の動作を変更することがあります。これでバグが修正された場合はお知らせください。それ以外の場合は試してみてください

関連する問題