2014-02-23 84 views
1

我們嘗試將C++代碼從Detection of coins (and fit ellipses) on an image轉換爲Java。在線程Problems with OpenCV ellipse detection in Java解決第一個問題,與參數Java運行時環境檢測到致命錯誤:Java中的OpenCV橢圓檢測

2 PathToThePicture 

導致以下致命錯誤

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000005addc330, pid=1700, tid=1472 
# 
# JRE version: Java(TM) SE Runtime Environment (7.0_45-b18) (build 1.7.0_45-b18) 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode windows-amd64 compressed oops) 
# Problematic frame: 
# C [msvcr100.dll+0x3c330] 
# 
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows 
# 
# An error report file with more information is saved as: 
# PathToTheProject\hs_err_pid1700.log 
# 
# If you would like to submit a bug report, please visit: 
# http://bugreport.sun.com/bugreport/crash.jsp 
# The crash happened outside the Java Virtual Machine in native code. 
# See problematic frame for where to report the bug. 
# 

錯誤報告啓動程序後:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x670d26df, pid=2832, tid=5672 
# 
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13) 
# Java VM: Java HotSpot(TM) Client VM (24.51-b03 mixed mode, sharing windows-x86) 
# Problematic frame: 
# C [msvcr100.dll+0x26df] 
# 
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows 
# 
# If you would like to submit a bug report, please visit: 
# http://bugreport.sun.com/bugreport/crash.jsp 
# The crash happened outside the Java Virtual Machine in native code. 
# See problematic frame for where to report the bug. 
# 

--------------- T H R E A D --------------- 

Current thread (0x004eb800): JavaThread "main" [_thread_in_native, id=5672, stack(0x00570000,0x005c0000)] 

siginfo: ExceptionCode=0xc0000005, writing address 0x00000000 

Registers: 
EAX=0x00000000, EBX=0x005bfb7c, ECX=0x00000016, EDX=0x00000000 
ESP=0x005bfaf4, EBP=0x005bfb18, ESI=0x004eb930, EDI=0x00000000 
EIP=0x670d26df, EFLAGS=0x00010202 

Top of Stack: (sp=0x005bfaf4) 
0x005bfaf4: 00000000 670c1eb2 00000000 00000000 
0x005bfb04: 00000058 004eb800 34a45f90 34a45f90 
0x005bfb14: 004eb930 005bfb60 0226a9dd 004eb930 
0x005bfb24: 005bfb68 005bfb7c 00000000 00000058 
0x005bfb34: 00000000 004ec15c 004ec15c 005bfb40 
0x005bfb44: 34a45f90 005bfb7c 34aaf550 00000000 
0x005bfb54: 34a45f90 00000000 005bfb70 005bfba0 
0x005bfb64: 0226339a 24ef55f8 022688e6 00000058 

Instructions: (pc=0x670d26df) 
0x670d26bf: 83 c7 01 83 e9 01 75 f6 8b c8 c1 e0 08 03 c1 8b 
0x670d26cf: c8 c1 e0 10 03 c1 8b ca 83 e2 03 c1 e9 02 74 06 
0x670d26df: f3 ab 85 d2 74 0a 88 07 83 c7 01 83 ea 01 75 f6 
0x670d26ef: 8b 44 24 08 5f c3 8b 44 24 04 c3 90 90 90 90 90 


Register to memory mapping: 

EAX=0x00000000 is an unknown value 
EBX=0x005bfb7c is pointing into the stack for thread: 0x004eb800 
ECX=0x00000016 is an unknown value 
EDX=0x00000000 is an unknown value 
ESP=0x005bfaf4 is pointing into the stack for thread: 0x004eb800 
EBP=0x005bfb18 is pointing into the stack for thread: 0x004eb800 
ESI=0x004eb930 is an unknown value 
EDI=0x00000000 is an unknown value 


Stack: [0x00570000,0x005c0000], sp=0x005bfaf4, free space=318k 
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
C [msvcr100.dll+0x26df] 
j com.googlecode.javacpp.Pointer.memset(Lcom/googlecode/javacpp/Pointer;IJ)Lcom/googlecode/javacpp/Pointer;+0 
j com.googlecode.javacpp.Pointer.fill(I)Lcom/googlecode/javacpp/Pointer;+107 
j com.googlecode.javacpp.Pointer.zero()Lcom/googlecode/javacpp/Pointer;+2 
j com.googlecode.javacv.cpp.opencv_core$CvSeq.<init>()V+9 
j com.googlecode.javacv.cpp.opencv_core$CvContour.<init>()V+1 
j Dieter.main([Ljava/lang/String;)V+67 
v ~StubRoutines::call_stub 
V [jvm.dll+0x13f35a] 
V [jvm.dll+0x202c6e] 
V [jvm.dll+0x13f3dd] 
V [jvm.dll+0xc9945] 
V [jvm.dll+0xd45e7] 
C [javaw.exe+0x2070] 
C [javaw.exe+0xa5b1] 
C [javaw.exe+0xa63b] 
C [KERNEL32.DLL+0x1495d] 
C [ntdll.dll+0x498ee] 
C [ntdll.dll+0x498c4] 

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) 
j com.googlecode.javacpp.Pointer.memset(Lcom/googlecode/javacpp/Pointer;IJ)Lcom/googlecode/javacpp/Pointer;+0 
j com.googlecode.javacpp.Pointer.fill(I)Lcom/googlecode/javacpp/Pointer;+107 
j com.googlecode.javacpp.Pointer.zero()Lcom/googlecode/javacpp/Pointer;+2 
j com.googlecode.javacv.cpp.opencv_core$CvSeq.<init>()V+9 
j com.googlecode.javacv.cpp.opencv_core$CvContour.<init>()V+1 
j Dieter.main([Ljava/lang/String;)V+67 
v ~StubRoutines::call_stub 

--------------- P R O C E S S --------------- 

Java Threads: (=> current thread) 
    0x00826800 JavaThread "Service Thread" daemon [_thread_blocked, id=7436, stack(0x044e0000,0x04530000)] 
    0x00820c00 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=6644, stack(0x04450000,0x044a0000)] 
    0x0081fc00 JavaThread "Attach Listener" daemon [_thread_blocked, id=1156, stack(0x043c0000,0x04410000)] 
    0x0081c800 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=1820, stack(0x04330000,0x04380000)] 
    0x007b0400 JavaThread "Finalizer" daemon [_thread_blocked, id=5456, stack(0x042a0000,0x042f0000)] 
    0x007ae800 JavaThread "Reference Handler" daemon [_thread_blocked, id=2588, stack(0x00de0000,0x00e30000)] 
=>0x004eb800 JavaThread "main" [_thread_in_native, id=5672, stack(0x00570000,0x005c0000)] 

Other Threads: 
    0x007ad400 VMThread [stack: 0x00d50000,0x00da0000] [id=3176] 
    0x0083e000 WatcherThread [stack: 0x04570000,0x045c0000] [id=4452] 

VM state:not at safepoint (normal execution) 

VM Mutex/Monitor currently owned by a thread: None 

Heap 
def new generation total 4928K, used 1323K [0x24a20000, 0x24f70000, 0x29f70000) 
    eden space 4416K, 18% used [0x24a20000, 0x24aeafe8, 0x24e70000) 
    from space 512K, 100% used [0x24ef0000, 0x24f70000, 0x24f70000) 
    to space 512K, 0% used [0x24e70000, 0x24e70000, 0x24ef0000) 
tenured generation total 10944K, used 370K [0x29f70000, 0x2aa20000, 0x34a20000) 
    the space 10944K, 3% used [0x29f70000, 0x29fccb38, 0x29fccc00, 0x2aa20000) 
compacting perm gen total 12288K, used 912K [0x34a20000, 0x35620000, 0x38a20000) 
    the space 12288K, 7% used [0x34a20000, 0x34b04270, 0x34b04400, 0x35620000) 
    ro space 10240K, 41% used [0x38a20000, 0x38e52050, 0x38e52200, 0x39420000) 
    rw space 12288K, 52% used [0x39420000, 0x39a66800, 0x39a66800, 0x3a020000) 

Card table byte_map: [0x00c40000,0x00cf0000] byte_map_base: 0x00b1af00 

Polling page: 0x004c0000 

Code Cache [0x02260000, 0x02320000, 0x04260000) 
total_blobs=266 nmethods=113 adapters=90 free_code_cache=32016Kb largest_free_block=32785344 

Compilation events (10 events): 
Event: 0.214 Thread 0x00820c00 108    java.util.AbstractList$Itr::hasNext (20 bytes) 
Event: 0.214 Thread 0x00820c00 nmethod 108 0x02319d48 code [0x02319e50, 0x02319f0c] 
Event: 0.215 Thread 0x00820c00 110    com.googlecode.javacpp.Loader$ClassProperties::addAll (183 bytes) 
Event: 0.216 Thread 0x00820c00 nmethod 110 0x0231a248 code [0x0231a490, 0x0231ac68] 
Event: 0.216 Thread 0x00820c00 111    java.lang.String::indexOf (25 bytes) 
Event: 0.216 Thread 0x00820c00 nmethod 111 0x0231b488 code [0x0231b590, 0x0231b65c] 
Event: 0.217 Thread 0x00820c00 112    java.lang.Character::toLowerCase (6 bytes) 
Event: 0.217 Thread 0x00820c00 nmethod 112 0x0231b748 code [0x0231b850, 0x0231b8f8] 
Event: 0.218 Thread 0x00820c00 113    java.util.Hashtable$Enumerator::hasMoreElements (53 bytes) 
Event: 0.218 Thread 0x00820c00 nmethod 113 0x0231b988 code [0x0231ba80, 0x0231bb60] 

GC Heap History (2 events): 
Event: 0.204 GC heap before 
{Heap before GC invocations=0 (full 0): 
def new generation total 4928K, used 4416K [0x24a20000, 0x24f70000, 0x29f70000) 
    eden space 4416K, 100% used [0x24a20000, 0x24e70000, 0x24e70000) 
    from space 512K, 0% used [0x24e70000, 0x24e70000, 0x24ef0000) 
    to space 512K, 0% used [0x24ef0000, 0x24ef0000, 0x24f70000) 
tenured generation total 10944K, used 0K [0x29f70000, 0x2aa20000, 0x34a20000) 
    the space 10944K, 0% used [0x29f70000, 0x29f70000, 0x29f70200, 0x2aa20000) 
compacting perm gen total 12288K, used 887K [0x34a20000, 0x35620000, 0x38a20000) 
    the space 12288K, 7% used [0x34a20000, 0x34afdfc8, 0x34afe000, 0x35620000) 
    ro space 10240K, 41% used [0x38a20000, 0x38e52050, 0x38e52200, 0x39420000) 
    rw space 12288K, 52% used [0x39420000, 0x39a66800, 0x39a66800, 0x3a020000) 
Event: 0.206 GC heap after 
Heap after GC invocations=1 (full 0): 
def new generation total 4928K, used 512K [0x24a20000, 0x24f70000, 0x29f70000) 
    eden space 4416K, 0% used [0x24a20000, 0x24a20000, 0x24e70000) 
    from space 512K, 100% used [0x24ef0000, 0x24f70000, 0x24f70000) 
    to space 512K, 0% used [0x24e70000, 0x24e70000, 0x24ef0000) 
tenured generation total 10944K, used 370K [0x29f70000, 0x2aa20000, 0x34a20000) 
    the space 10944K, 3% used [0x29f70000, 0x29fccb38, 0x29fccc00, 0x2aa20000) 
compacting perm gen total 12288K, used 887K [0x34a20000, 0x35620000, 0x38a20000) 
    the space 12288K, 7% used [0x34a20000, 0x34afdfc8, 0x34afe000, 0x35620000) 
    ro space 10240K, 41% used [0x38a20000, 0x38e52050, 0x38e52200, 0x39420000) 
    rw space 12288K, 52% used [0x39420000, 0x39a66800, 0x39a66800, 0x3a020000) 
} 

Deoptimization events (0 events): 
No events 

Internal exceptions (10 events): 
Event: 0.177 Thread 0x004eb800 Threw 0x24e2f6d8 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.177 Thread 0x004eb800 Threw 0x24e33ec8 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.203 Thread 0x004eb800 Threw 0x24e569d8 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.206 Thread 0x004eb800 Threw 0x24a27c80 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.207 Thread 0x004eb800 Threw 0x24a2ad28 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.207 Thread 0x004eb800 Threw 0x24a2dc90 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.207 Thread 0x004eb800 Threw 0x24a314d0 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.208 Thread 0x004eb800 Threw 0x24a5f148 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.216 Thread 0x004eb800 Threw 0x24acf300 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 
Event: 0.217 Thread 0x004eb800 Threw 0x24ad3248 at C:\re\jdk7u51\527\hotspot\src\share\vm\prims\jvm.cpp:1244 

Events (10 events): 
Event: 0.207 loading class 0x0462fa78 
Event: 0.207 loading class 0x0462fa78 done 
Event: 0.208 loading class 0x0462fe38 
Event: 0.208 loading class 0x0462fe38 done 
Event: 0.216 loading class 0x0083ef48 
Event: 0.216 loading class 0x0083ef48 done 
Event: 0.217 loading class 0x0083f338 
Event: 0.217 loading class 0x0083f338 done 
Event: 0.218 loading class 0x3a040448 
Event: 0.218 loading class 0x3a040448 done 


Dynamic libraries: 
0x00e30000 - 0x00e5f000  C:\Program Files (x86)\Java\jre7\bin\javaw.exe 
0x76ed0000 - 0x77038000  C:\Windows\SYSTEM32\ntdll.dll 
0x74b20000 - 0x74c60000  C:\Windows\SYSTEM32\KERNEL32.DLL 
0x751e0000 - 0x752af000  C:\Windows\SYSTEM32\KERNELBASE.dll 
0x69530000 - 0x695ca000  C:\Windows\system32\apphelp.dll 
0x64c10000 - 0x64e62000  C:\Windows\AppPatch\AcGenral.DLL 
0x74f90000 - 0x7504e000  C:\Windows\SYSTEM32\msvcrt.dll 
0x74ae0000 - 0x74b1e000  C:\Windows\SYSTEM32\sechost.dll 
0x74900000 - 0x7491d000  C:\Windows\SYSTEM32\SspiCli.dll 
0x76bd0000 - 0x76c11000  C:\Windows\SYSTEM32\SHLWAPI.dll 
0x73df0000 - 0x73ecc000  C:\Windows\SYSTEM32\UxTheme.dll 
0x74ca0000 - 0x74def000  C:\Windows\SYSTEM32\USER32.dll 
0x76a10000 - 0x76b18000  C:\Windows\SYSTEM32\GDI32.dll 
0x73a30000 - 0x73a50000  C:\Windows\SYSTEM32\WINMM.dll 
0x73c70000 - 0x73c82000  C:\Windows\SYSTEM32\samcli.dll 
0x76c70000 - 0x76d7b000  C:\Windows\SYSTEM32\ole32.dll 
0x74a40000 - 0x74ac7000  C:\Windows\SYSTEM32\OLEAUT32.dll 
0x731a0000 - 0x731b5000  C:\Windows\SYSTEM32\MSACM32.dll 
0x74880000 - 0x74888000  C:\Windows\SYSTEM32\VERSION.dll 
0x75860000 - 0x76a03000  C:\Windows\SYSTEM32\SHELL32.dll 
0x739c0000 - 0x739d9000  C:\Windows\SYSTEM32\USERENV.dll 
0x739f0000 - 0x73a09000  C:\Windows\SYSTEM32\dwmapi.dll 
0x000 - 0x73334000  C:\Windows\SYSTEM32\urlmon.dll 
0x75060000 - 0x750d7000  C:\Windows\SYSTEM32\ADVAPI32.dll 
0x74820000 - 0x7487e000  C:\Windows\SYSTEM32\WINSPOOL.DRV 
0x67500000 - 0x67514000  C:\Windows\SYSTEM32\MPR.dll 
0x752b0000 - 0x75361000  C:\Windows\SYSTEM32\RPCRT4.dll 
0x748f0000 - 0x748f9000  C:\Windows\SYSTEM32\CRYPTBASE.dll 
0x75380000 - 0x754ce000  C:\Windows\SYSTEM32\combase.dll 
0x73a10000 - 0x73a30000  C:\Windows\SYSTEM32\WINMMBASE.dll 
0x74050000 - 0x7405e000  C:\Windows\SYSTEM32\profapi.dll 
0x72e30000 - 0x73047000  C:\Windows\SYSTEM32\iertutil.dll 
0x72c60000 - 0x72e24000  C:\Windows\SYSTEM32\WININET.dll 
0x74890000 - 0x748e1000  C:\Windows\SYSTEM32\bcryptPrimitives.dll 
0x74f40000 - 0x74f7a000  C:\Windows\SYSTEM32\cfgmgr32.dll 
0x74800000 - 0x7481f000  C:\Windows\SYSTEM32\DEVOBJ.dll 
0x74060000 - 0x740d7000  C:\Windows\SYSTEM32\SHCORE.DLL 
0x74920000 - 0x74945000  C:\Windows\system32\IMM32.DLL 
0x750e0000 - 0x751d7000  C:\Windows\SYSTEM32\MSCTF.dll 
0x74450000 - 0x74635000  C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9600.16384_none_a9f4965301334e09\COMCTL32.dll 
0x670d0000 - 0x6718f000  C:\Program Files (x86)\Java\jre7\bin\msvcr100.dll 
0x64f80000 - 0x65300000  C:\Program Files (x86)\Java\jre7\bin\client\jvm.dll 
0x74040000 - 0x74048000  C:\Windows\SYSTEM32\WSOCK32.dll 
0x749a0000 - 0x749a6000  C:\Windows\SYSTEM32\PSAPI.DLL 
0x76c20000 - 0x76c6d000  C:\Windows\SYSTEM32\WS2_32.dll 
0x74f80000 - 0x74f87000  C:\Windows\SYSTEM32\NSI.dll 
0x66ba0000 - 0x66bac000  C:\Program Files (x86)\Java\jre7\bin\verify.dll 
0x66b80000 - 0x66ba0000  C:\Program Files (x86)\Java\jre7\bin\java.dll 
0x66b60000 - 0x66b73000  C:\Program Files (x86)\Java\jre7\bin\zip.dll 
0x66910000 - 0x66979000  C:\Windows\System32\msvcp100.dll 
0x70fc0000 - 0x71ef6000  C:\opencv\build\x86\vc10\bin\opencv_ffmpeg248.dll 
0x64a00000 - 0x64c06000  C:\opencv\build\x86\vc10\bin\opencv_core248.dll 
0x64790000 - 0x649fb000  C:\opencv\build\x86\vc10\bin\opencv_imgproc248.dll 
0x64580000 - 0x64787000  C:\opencv\build\x86\vc10\bin\opencv_highgui248.dll 
0x66d80000 - 0x66d99000  C:\Windows\SYSTEM32\AVIFIL32.dll 
0x67490000 - 0x674b2000  C:\Windows\SYSTEM32\MSVFW32.dll 
0x66d60000 - 0x66d74000  C:\Windows\SYSTEM32\AVICAP32.dll 
0x670c0000 - 0x670cf000  F:\tmp\javacpp367334687899361\jniopencv_highgui.dll 
0x66810000 - 0x66885000  F:\tmp\javacpp367334687899361\jniopencv_core.dll 
0x72260000 - 0x723a8000  C:\Windows\SYSTEM32\dbghelp.dll 

VM Arguments: 
jvm_args: -Dfile.encoding=Cp1252 
java_command: DetectEllipse 2 PathToPicture 
Launcher Type: SUN_STANDARD 

Environment Variables: 
PATH=C:/Program Files (x86)/Java/jre7/bin/client;C:/Program Files (x86)/Java/jre7/bin;C:/Program Files (x86)/Java/jre7/lib/i386;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\IVI Foundation\VISA\WinNT\Bin;F:\Programmieren\tools\eclipse 32bit; 
USERNAME=Username 
OS=Windows_NT 
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 60 Stepping 3, GenuineIntel 



--------------- S Y S T E M --------------- 

OS: Windows 8 , 64 bit Build 9200 

CPU:total 4 (4 cores per cpu, 1 threads per core) family 6 model 60 stepping 3, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, erms, tsc, tscinvbit 

Memory: 4k page, physical 8325332k(5583064k free), swap 13445332k(10026960k free) 

vm_info: Java HotSpot(TM) Client VM (24.51-b03) for windows-x86 JRE (1.7.0_51-b13), built on Dec 18 2013 19:09:58 by "java_re" with unknown MS VC++:1600 

time: Sun Feb 23 01:12:58 2014 
elapsed time: 0 seconds 

這裏是轉換後的Java代碼:

import static com.googlecode.javacv.cpp.opencv_core.CV_FILLED; 
import static com.googlecode.javacv.cpp.opencv_core.CV_RGB; 
import static com.googlecode.javacv.cpp.opencv_core.CV_WHOLE_SEQ; 
import static com.googlecode.javacv.cpp.opencv_core.cvCreateImage; 
import static com.googlecode.javacv.cpp.opencv_core.cvCreateMemStorage; 
import static com.googlecode.javacv.cpp.opencv_core.cvDrawContours; 
import static com.googlecode.javacv.cpp.opencv_core.cvGetSize; 
import static com.googlecode.javacv.cpp.opencv_core.cvPoint; 
import static com.googlecode.javacv.cpp.opencv_core.cvScalar; 
import static com.googlecode.javacv.cpp.opencv_core.cvXorS; 
import static com.googlecode.javacv.cpp.opencv_core.cvZero; 
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage; 
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_CHAIN_APPROX_SIMPLE; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_RETR_CCOMP; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_THRESH_BINARY; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvContourArea; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvDilate; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvFindContours; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvThreshold; 

import com.googlecode.javacpp.Loader; 
import com.googlecode.javacv.cpp.opencv_core.CvContour; 
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage; 
import com.googlecode.javacv.cpp.opencv_core.CvRect; 
import com.googlecode.javacv.cpp.opencv_core.CvScalar; 
import com.googlecode.javacv.cpp.opencv_core.CvSeq; 
import com.googlecode.javacv.cpp.opencv_core.IplImage; 

public class DetectEllipse{ 

    public static final double M_PI = 3.14159265358979323846; 
    public static final double MIN_AREA = 100.00; 
    public static final double MAX_TOL = 100.00; 

    private static int[] array = { 0 }; 
    // 
    // We need this to be high enough to get rid of things that are too small 
    // too 
    // have a definite shape. Otherwise, they will end up as ellipse false 
    // positives. 
    // 
    // 
    // One way to tell if an object is an ellipse is to look at the relationship 
    // of its area to its dimensions. If its actual occupied area can be 
    // estimated 
    // using the well-known area formula Area = PI*A*B, then it has a good 
    // chance of 
    // being an ellipse. 
    // 
    // This value is the maximum permissible error between actual and estimated 
    // area. 
    // 

    public static void main(String[] args) { 
      IplImage src = cvLoadImage(args[1], 0); 
      if (src == null) { 
      System.out.println("!!! Unable to load image: " + args[1]); 
      return; 
      } 
     // the first command line parameter must be file name of binary 
     // (black-n-white) image 
     if (Integer.parseInt(args[0]) == 2) { 
      IplImage dst = cvCreateImage(cvGetSize(src), 8, 3); 
      CvMemStorage storage = cvCreateMemStorage(0); 
      CvSeq contour = new CvContour(); 
      // maybe: = new CvSeq(0) 
      cvThreshold(src, src, 1, 255, CV_THRESH_BINARY); 
      // 
      // Invert the image such that white is foreground, black is 
      // background. 
      // Dilate to get rid of noise. 
      // 
      cvXorS(src, cvScalar(255, 0, 0, 0), src, null); 
      cvDilate(src, src, null, 2); 

      cvFindContours(src, storage, contour, 
        Loader.sizeof(CvContour.class), CV_RETR_CCOMP, 
        CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0)); 
      cvZero(dst); 

      for (; contour.flags() != 0; contour = contour.h_next()) { 
       // if not working: use contour.isNull() 
       double actual_area = Math.abs(cvContourArea(contour, 
         CV_WHOLE_SEQ, 0)); 
       if (actual_area < MIN_AREA) 
        continue; 

       // 
       // FIXME: 
       // Assuming the axes of the ellipse are vertical/perpendicular. 
       // 
       CvRect rect = ((CvContour) contour).rect(); 
       int A = rect.width()/2; 
       int B = rect.height()/2; 
       double estimated_area = Math.PI * A * B; 
       double error = Math.abs(actual_area - estimated_area); 
       if (error > MAX_TOL) 
        continue; 
       System.out.printf("center x: %d y: %d A: %d B: %d\n", rect.x() 
         + A, rect.y() + B, A, B); 

       CvScalar color = CV_RGB(
         tangible.RandomNumbers.nextNumber() % 255, 
         tangible.RandomNumbers.nextNumber() % 255, 
         tangible.RandomNumbers.nextNumber() % 255); 
       cvDrawContours(dst, contour, color, color, -1, CV_FILLED, 8, 
         cvPoint(0, 0)); 
      } 

      cvSaveImage("coins.png", dst, array); 
     } 
    } 

} 
+0

調試代碼來確定哪條線是導致崩潰的線是很重要的。當你有這個信息時報告回來! – karlphillip

+0

行'cvThreshold(src,src,1,255,CV_THRESH_BINARY);'負責崩潰 – Baschdl

回答

1

cvThreshold()需要一個單通道圖像,並且您正在告訴它將結果存儲在一個3通道圖像中,因此出現故障!您可以撥打cvCreateImage()創建單個頻道IplImage

祝你好運!

相關問題