3

私はスタックオーバーフローで多くのチュートリアルといくつかの質問を経験し、長方形を描くために使用される次の方法を見つけました。

public static void drawSquares( IplImage image, final CvSeq squares )
{
    if(!squares.isNull()){
            CvSeq p = new CvSeq(squares.total());
            cvCvtSeqToArray(squares, p, CV_WHOLE_SEQ);
            System.out.println(squares.total());
        for(int i = 0; i < squares.total(); i ++  )
        {
             CvPoint pts = new CvPoint(4);

             cvCvtSeqToArray(p.position(i), pts, CV_WHOLE_SEQ);
//                 //cvBoundingRect(image, i);
            int npt[] = {4, 4};
//                //DrawLine() reference http://opencv.willowgarage.com/documentation/cpp/drawing_functions.html#cv-line
            cvDrawLine(image, new CvPoint(pts.position(0).x(),pts.position(0).y()), new CvPoint(pts.position(1).x(),pts.position(1).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(1).x(),pts.position(1).y()), new CvPoint(pts.position(2).x(),pts.position(2).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(2).x(),pts.position(2).y()), new CvPoint(pts.position(3).x(),pts.position(3).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(3).x(),pts.position(3).y()), new CvPoint(pts.position(0).x(),pts.position(0).y()), CvScalar.GREEN, 3, CV_AA, 0);

        }
    }
    final CanvasFrame canvas = new CanvasFrame(wndname);
    canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    canvas.showImage(image);
}

このコードは、長方形を描画するときに正確に実行されます。しかし、このメソッドを変更して、8 つの辺を持つポリゴンを描画する必要があります。次のようにコードを変更しようとしましたが、期待した結果が得られません。

public static void drawPoly( IplImage image, final CvSeq poly )
{
    if(!poly.isNull()){
            CvSeq p = new CvSeq(poly.total());
            cvCvtSeqToArray(poly, p, CV_WHOLE_SEQ);
            System.out.println(poly.total());
        for(int i = 0; i < poly.total(); i ++  )
        {
                System.out.println(i);
             CvPoint pts = new CvPoint(8);

             cvCvtSeqToArray(p.position(i), pts, CV_WHOLE_SEQ);

            cvDrawLine(image, new CvPoint(pts.position(0).x(),pts.position(0).y()), new CvPoint(pts.position(1).x(),pts.position(1).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(1).x(),pts.position(1).y()), new CvPoint(pts.position(2).x(),pts.position(2).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(2).x(),pts.position(2).y()), new CvPoint(pts.position(3).x(),pts.position(3).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(3).x(),pts.position(3).y()), new CvPoint(pts.position(4).x(),pts.position(4).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(4).x(),pts.position(4).y()), new CvPoint(pts.position(5).x(),pts.position(5).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(5).x(),pts.position(5).y()), new CvPoint(pts.position(6).x(),pts.position(6).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(6).x(),pts.position(6).y()), new CvPoint(pts.position(7).x(),pts.position(7).y()), CvScalar.GREEN, 3, CV_AA, 0);
            cvDrawLine(image, new CvPoint(pts.position(7).x(),pts.position(7).y()), new CvPoint(pts.position(0).x(),pts.position(0).y()), CvScalar.GREEN, 3, CV_AA, 0);

        }
    }
    final CanvasFrame canvas = new CanvasFrame("Test inside last");
    canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    canvas.showImage(image);
} 

これにより、次のエラーメッセージが表示されますが、理由がわかりません。

0
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x5c995048, pid=5992, tid=4464
#
# JRE version: 6.0_16-b01
# Java VM: Java HotSpot(TM) Client VM (14.2-b01 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [opencv_core240.dll+0x55048]
#
# An error report file with more information is saved as:
# C:\Users\Space\Documents\NetBeansProjects\1MyJavacv\hs_err_pid5992.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Java Result: 1

なぜそれが実行されないのか、私のメソッドのどこが間違っているのか説明してください。

4

1 に答える 1

2

最初に行う必要があるのは、問題のドメインを単純な繰り返し可能なケースに縮小することです。クラッシュの原因となっているポリゴン シェイプを特定します。opencvの C/C++ ソース コードをて、実行されないチェックを確認できます。たとえば、オフスクリーン ピクセルは許可されますか?

さらに進んで、一連のチェックを実行し、各関数呼び出しをログに記録するラッパー クラスを記述して、エラーが発生した正確なタイミング、エラーが毎回同じ場所で発生したかどうか、および原因となった一連のイベントを知ることができます。エラーに。

drawPoly別の方法として、一時的にdrawPolycallを使用して渡されたポイントをテストしdrawSquare、最初にポイント 0 ~ 3 を送信し、次にポイント 4 ~ 7 を送信して、送信されたポイントが問題を引き起こしていないという事実を検証することもできます。

于 2012-07-23T17:36:41.017 に答える