2016-12-07 12 views
2

JavaCVを初めて使用しています。私は、画像内で最大の矩形を検出しようとしており、元の画像よりも色で輪郭を描いています。下記のコードを投稿していますが、動作していません。私はedgeDetectedImageを正しく取得しています。私は適切に4つのコーナーポイントを得ています。ただcvDrawLineは機能していません。何か不足している場合はお手伝いください:Android:JavaCVによる形状検出

OnClickボタン私は画像を加工しており、ImageViewに再度表示しています。ボタンのonClickListenerで :

if ((new File(path + "trial.jpg")).exists()) { 
    opencv_core.IplImage originalImage = opencv_imgcodecs.cvLoadImage(path + "trial.jpg", opencv_imgcodecs.CV_IMWRITE_JPEG_QUALITY); 
    opencv_core.IplImage iplImage = opencv_imgcodecs.cvLoadImage(path + "trial.jpg", opencv_imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); 
    opencv_core.IplImage edgeDetectedImage = applyCannyRectangleEdgeDetection(iplImage, 80); 
    opencv_core.CvSeq largestContour = findLargestContour(edgeDetectedImage); 
    opencv_core.CvPoint[] cvPoints = new opencv_core.CvPoint[4]; 
    for(int i=0; i<largestContour.total();i++) 
    { 
    opencv_core.CvPoint cvPoint = new opencv_core.CvPoint(cvGetSeqElem(largestContour, i)); 
    cvPoints[i] = cvPoint; 
    } 
    cvDrawLine(originalImage, cvPoints[0], cvPoints[1], opencv_core.CvScalar.YELLOW, 10, 10, 10); 
    cvDrawLine(originalImage, cvPoints[1], cvPoints[2], opencv_core.CvScalar.YELLOW, 10, 10, 10); 
    cvDrawLine(originalImage, cvPoints[2], cvPoints[3], opencv_core.CvScalar.YELLOW, 10,10, 10); 
    cvDrawLine(originalImage, cvPoints[3], cvPoints[0], opencv_core.CvScalar.YELLOW, 10, 10,10); 
    opencv_imgcodecs.cvSaveImage(path + "img1.jpg", originalImage); 
        if ((new File(path + "img1.jpg").exists())) { 
         imageView.setImageDrawable(Drawable.createFromPath(path + "img1.jpg")); 
        } 
       } 

方法applyCannyRectangleEdgeDetection(IplImageへ、INT):

private opencv_core.IplImage applyCannyRectangleEdgeDetection(opencv_core.IplImage iplImage, int percent) { 
    opencv_core.IplImage destImage = downScaleImage(iplImage, percent); 
    OpenCVFrameConverter.ToMat converterToMat = new OpenCVFrameConverter.ToMat(); 
    Frame grayImageFrame = converterToMat.convert(destImage); 
    opencv_core.Mat grayImageMat = converterToMat.convertToMat(grayImageFrame); 
    GaussianBlur(grayImageMat, grayImageMat, new opencv_core.Size(5, 5), 0.0, 0.0, BORDER_DEFAULT); 
    destImage = converterToMat.convertToIplImage(grayImageFrame); 
    cvErode(destImage, destImage); 
    cvDilate(destImage, destImage); 
    cvCanny(destImage, destImage, 20, 55); 
    return destImage; 
} 

方法downScaleImage(IplImageへ、INT)

private opencv_core.IplImage downScaleImage(opencv_core.IplImage srcImage, int percent) { 
    opencv_core.IplImage destImage = cvCreateImage(cvSize((srcImage.width() * percent)/100, (srcImage.height() * percent)/100), srcImage.depth(), srcImage.nChannels()); 
    cvResize(srcImage, destImage); 
    return destImage; 
} 

方法findLargestContour(IplImageへ)

private opencv_core.CvSeq findLargestContour(opencv_core.IplImage edgeDetectedImage) { 
    opencv_core.IplImage foundContoursOfImage = cvCloneImage(edgeDetectedImage); 
    opencv_core.CvMemStorage memory = new opencv_core.CvMemStorage().create(); 
    opencv_core.CvSeq contours = new opencv_core.CvSeq(); 
    cvFindContours(foundContoursOfImage, memory, contours, Loader.sizeof(opencv_core.CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, new opencv_core.CvPoint(0, 0)); 
    int maxWidth = 0; 
    int maxHeight = 0; 
    opencv_core.CvRect contr = null; 
    opencv_core.CvSeq seqFound = null; 
    opencv_core.CvSeq nextSeq; 
    for (nextSeq = contours; nextSeq != null; nextSeq = nextSeq.h_next()) { 
     contr = cvBoundingRect(nextSeq, 0); 
     if ((contr.width() >= maxWidth) && (contr.height() >= maxHeight)) { 
      maxHeight = contr.height(); 
      maxWidth = contr.width(); 
      seqFound = nextSeq; 
     } 
    } 
    opencv_core.CvSeq result = cvApproxPoly(seqFound, Loader.sizeof(opencv_core.CvContour.class), memory, CV_POLY_APPROX_DP, cvContourPerimeter(seqFound) * 0.1, 0); 
    return result; 
} 

答えて

0

申し訳ありませんが、これはコメントに記載する必要がありますが、私は評判が十分ではありません。私があなたのコードから見ることができるのは、キャニーが縮小された画像に適用され、輪郭も同様です。元のイメージ(パーセントで縮小されていない)上に線を描画しているので、自然に見た目が正しくない(正しいとは思えないが、何かが描かれている)。それ以外の場合は、イメージの色空間について言及する必要があります。描画には関係ありませんが、cannyに対しては意味があります。

+0

私はダウンスケーリングされたイメージと描画のポイントを取っています。これらの4つのコーナーポイントを取得するために、すべての操作がダウンスケーリングとキャニーに行われました。そして、これらの点を使って、元の画像に線を引いています。元のイメージでは次元が適切ではないが、イメージ上では何かを描くべきだが、それに応じて何を言っているのだろうか。ここの私の場合、画像には何も描かれません。 –

+0

画像とコーナーポイントを投稿できますか?そうでない場合は、イメージで四角形のコーナーの座標を確認しましたか? –

+0

あなたのコードからは、あなたが描画している元の画像のサイズである0.8の画像から輪郭が抽出されているように見えます。また、どのOpenCVのバージョンを使用していますか? –

関連する問題