2012-07-13 80 views
3

我经历了很多turotials和cuover的问题在stackoverflow中,我发现下面的方法用于绘制矩形。如何编辑此方法以使用javacv绘制多边形?

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 

可以请一些解释一个为什么它不跑的,什么是错误的与我methid?

+0

你可以发布一个[SSCCE](http://www.sscce.org/)来重现你的问题吗?否则“hs_err_pid5992.log”的内容可能也会有所帮助 – Attila 2012-07-17 13:13:09

+0

您是否得到了drawSquares方法?你还可以在你找到它的地方提供stackoverflow链接吗? – nikhil 2012-07-18 08:05:36

+0

它在错误信息中说,这个异常是在Java虚拟机之外抛出的*。这是Java绕过C代码抛出的某种异常。 – 2012-07-19 01:56:35

回答

2

您需要做的第一件事是将问题域降低为简单可重复的情况。确定哪些多边形形状导致崩溃。你可能看看opencv的C/C++源代码,看看它没有执行什么检查,例如它是否允许离屏像素?

你可以进一步写出一个包装类,它执行一系列检查并记录每个函数调用,从而可以准确知道错误发生的时间,错误是否发生在每次同一地点以及序列导致错误的事件。

另外,您可以通过暂时有drawPoly呼叫drawSquare测试传递给drawPoly点,第一个点发送0-3,然后分4-7,只是为了验证一个事实,即发送的点不触发的问题。