Merge lp:~yolanda.robla/ubuntu/saucy/sikuli/debian_merge into lp:ubuntu/saucy/sikuli

Proposed by Yolanda Robla
Status: Merged
Merged at revision: 15
Proposed branch: lp:~yolanda.robla/ubuntu/saucy/sikuli/debian_merge
Merge into: lp:ubuntu/saucy/sikuli
Diff against target: 11100 lines (+744/-9680)
55 files modified
.pc/applied-patches (+0/-10)
.pc/executable-wrappers.patch/sikuli-ide/target/linux/Sikuli-IDE/sikuli-ide.sh (+0/-3)
.pc/executable-wrappers.patch/sikuli-script/target/sikuli-script.sh (+0/-2)
.pc/fix-cmake-sikuli-ide.patch/sikuli-ide/CMakeLists.txt (+0/-403)
.pc/gcc-4.7.patch/sikuli-script/src/main/native/sikuli-debug.h (+0/-52)
.pc/install-extension.patch/sikuli-script/src/main/java/org/sikuli/script/ExtensionManager.java (+0/-175)
.pc/jgoodies-1.6-compat.patch/sikuli-ide/CMakeLists.txt (+0/-405)
.pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main/java/org/sikuli/ide/PreferencesWin.java (+0/-561)
.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/Finder.java (+0/-195)
.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/TextRecognizer.java (+0/-120)
.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/VDictProxy.java (+0/-118)
.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/internal/hotkey/LinuxHotkeyManager.java (+0/-106)
.pc/native.patch/sikuli-script/src/main/native/vision.i (+0/-264)
.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/cvgui.cpp (+0/-2508)
.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/cvgui.h (+0/-239)
.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/imgdb.cpp (+0/-311)
.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/imgdb.h (+0/-75)
.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/vision.cpp (+0/-506)
.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/vision.h (+0/-118)
.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/vision.i (+0/-264)
.pc/tess3.patch/cmake_modules/FindTesseract.cmake (+0/-47)
.pc/tess3.patch/sikuli-script/src/main/native/tessocr.cpp (+0/-984)
.pc/tessdata.patch/sikuli-script/CMakeLists.txt (+0/-297)
.pc/tessdata.patch/sikuli-script/src/main/java/org/sikuli/script/TextRecognizer.java (+0/-118)
.pc/tessdata.patch/sikuli-script/src/main/native/tessocr.cpp (+0/-983)
.pc/use-java-libs-from-debian.patch/sikuli-ide/CMakeLists.txt (+0/-404)
.pc/use-java-libs-from-debian.patch/sikuli-script/CMakeLists.txt (+0/-298)
cmake_modules/FindTesseract.cmake (+12/-3)
debian/changelog (+36/-0)
debian/control (+6/-6)
debian/patches/executable-wrappers.patch (+6/-6)
debian/patches/force-java6-target.patch (+30/-0)
debian/patches/jgoodies-1.6-compat.patch (+0/-40)
debian/patches/series (+2/-1)
debian/patches/setTextAndMnemonic.patch (+64/-0)
debian/rules (+1/-1)
sikuli-ide/CMakeLists.txt (+12/-14)
sikuli-ide/src/main/java/org/sikuli/ide/PreferencesWin.java (+2/-3)
sikuli-ide/target/linux/Sikuli-IDE/sikuli-ide.sh (+2/-1)
sikuli-script/CMakeLists.txt (+17/-16)
sikuli-script/src/main/java/org/sikuli/script/ExtensionManager.java (+2/-3)
sikuli-script/src/main/java/org/sikuli/script/Finder.java (+4/-2)
sikuli-script/src/main/java/org/sikuli/script/TextRecognizer.java (+11/-5)
sikuli-script/src/main/java/org/sikuli/script/VDictProxy.java (+3/-2)
sikuli-script/src/main/java/org/sikuli/script/internal/hotkey/LinuxHotkeyManager.java (+3/-2)
sikuli-script/src/main/native/cvgui.cpp (+318/-0)
sikuli-script/src/main/native/cvgui.h (+1/-0)
sikuli-script/src/main/native/imgdb.cpp (+115/-0)
sikuli-script/src/main/native/imgdb.h (+5/-0)
sikuli-script/src/main/native/sikuli-debug.h (+1/-1)
sikuli-script/src/main/native/tessocr.cpp (+12/-3)
sikuli-script/src/main/native/vision.cpp (+63/-0)
sikuli-script/src/main/native/vision.h (+5/-0)
sikuli-script/src/main/native/vision.i (+10/-4)
sikuli-script/target/sikuli-script.sh (+1/-1)
To merge this branch: bzr merge lp:~yolanda.robla/ubuntu/saucy/sikuli/debian_merge
Reviewer Review Type Date Requested Status
Daniel Holbach (community) Approve
Review via email: mp+176670@code.launchpad.net

Description of the change

Merging from latest Debian version

To post a comment you must log in.
Revision history for this message
Daniel Holbach (dholbach) wrote :

Thanks. Uploaded.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== removed file '.pc/applied-patches'
--- .pc/applied-patches 2012-12-07 22:13:08 +0000
+++ .pc/applied-patches 1970-01-01 00:00:00 +0000
@@ -1,10 +0,0 @@
1executable-wrappers.patch
2native.patch
3use-java-libs-from-debian.patch
4install-extension.patch
5fix-cmake-sikuli-ide.patch
6tess3.patch
7tessdata.patch
8gcc-4.7.patch
9no-opencv-surf-module.patch
10jgoodies-1.6-compat.patch
110
=== removed directory '.pc/executable-wrappers.patch'
=== removed directory '.pc/executable-wrappers.patch/sikuli-ide'
=== removed directory '.pc/executable-wrappers.patch/sikuli-ide/target'
=== removed directory '.pc/executable-wrappers.patch/sikuli-ide/target/linux'
=== removed directory '.pc/executable-wrappers.patch/sikuli-ide/target/linux/Sikuli-IDE'
=== removed file '.pc/executable-wrappers.patch/sikuli-ide/target/linux/Sikuli-IDE/sikuli-ide.sh'
--- .pc/executable-wrappers.patch/sikuli-ide/target/linux/Sikuli-IDE/sikuli-ide.sh 2011-04-16 00:23:53 +0000
+++ .pc/executable-wrappers.patch/sikuli-ide/target/linux/Sikuli-IDE/sikuli-ide.sh 1970-01-01 00:00:00 +0000
@@ -1,3 +0,0 @@
1#!/bin/sh
2DIR=`dirname $0`
3LC_NUMERIC=C java -Dsikuli.console=true -Dsikuli.debug=0 -Xms64M -Xmx512M -Dfile.encoding=UTF-8 -jar $DIR/sikuli-ide.jar $*
40
=== removed directory '.pc/executable-wrappers.patch/sikuli-script'
=== removed directory '.pc/executable-wrappers.patch/sikuli-script/target'
=== removed file '.pc/executable-wrappers.patch/sikuli-script/target/sikuli-script.sh'
--- .pc/executable-wrappers.patch/sikuli-script/target/sikuli-script.sh 2011-01-24 01:07:30 +0000
+++ .pc/executable-wrappers.patch/sikuli-script/target/sikuli-script.sh 1970-01-01 00:00:00 +0000
@@ -1,2 +0,0 @@
1#!/bin/sh
2java -jar sikuli-script.jar $@
30
=== removed directory '.pc/fix-cmake-sikuli-ide.patch'
=== removed directory '.pc/fix-cmake-sikuli-ide.patch/sikuli-ide'
=== removed file '.pc/fix-cmake-sikuli-ide.patch/sikuli-ide/CMakeLists.txt'
--- .pc/fix-cmake-sikuli-ide.patch/sikuli-ide/CMakeLists.txt 2011-10-04 23:32:13 +0000
+++ .pc/fix-cmake-sikuli-ide.patch/sikuli-ide/CMakeLists.txt 1970-01-01 00:00:00 +0000
@@ -1,403 +0,0 @@
1# Copyright 2010-2011, Sikuli.org
2# Released under the MIT License.
3CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
4PROJECT (sikuli-ide Java)
5
6SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake_modules")
7INCLUDE(${CMAKE_MODULE_PATH}/common.cmake)
8INCLUDE(${CMAKE_MODULE_PATH}/detect_osx_ver.cmake)
9INCLUDE(${CMAKE_MODULE_PATH}/find_dep_libs.cmake)
10
11
12ENABLE_TESTING()
13
14SET(CMAKE_VERBOSE_MAKEFILE 0)
15
16FIND_PACKAGE(Java 1.6 REQUIRED)
17SET( NON_NATIVE_TARGET TRUE)
18
19IF(UNIX)
20 SET(SEP ":")
21ELSE()
22 SET(SEP ";")
23ENDIF()
24
25
26SET(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
27SET(JAVA_SRC_DIR "${BASE_DIR}/src/main/java")
28SET(NATIVE_SRC_DIR "${BASE_DIR}/src/main/native")
29SET(COMMON_LIB_DIR "${BASE_DIR}/../lib")
30SET(INCLUDE_LIB_DIR "${BASE_DIR}/lib")
31SET(BINARY_DIR "${BASE_DIR}/target")
32SET(BINARY_CLASS_DIR "${BINARY_DIR}/classes")
33SET(BINARY_LIB_DIR "${BINARY_DIR}/lib")
34SET(JAR_DIR "${BINARY_DIR}/jar")
35SET(RESOURCE_DIR "${BASE_DIR}/resources")
36SET(RELEASE_DIR "${BASE_DIR}/../release")
37
38SET(JAVA_TEST_DIR "${BASE_DIR}/src/test/java")
39SET(TEST_RESOURCE_DIR "test-res")
40SET(JAVA_TEST_FOR_HUDSON_XML "../hudson-test.xml")
41SET(TEST_CLASS_DIR "${CMAKE_BINARY_DIR}/test")
42
43SET(SIKULI_SCRIPT_JAR "${COMMON_LIB_DIR}/sikuli-script.jar")
44SET(JUNIT_JAR "/usr/share/java/junit.jar")
45SET(SWING_LAYOUT_JAR "/usr/share/java/swing-layout.jar")
46SET(COMMONS_CLI_JAR "/usr/share/java/commons-cli.jar")
47SET(JSON_SIMPLE_JAR "/usr/share/java/json_simple.jar")
48SET(SWINGX_JAR "/usr/share/java/swingx-core.jar")
49SET(MAC_WIDGETS_JAR "/usr/share/java/mac_widgets.jar")
50SET(FORMS_JAR "/usr/share/java/forms.jar")
51
52
53FILE(MAKE_DIRECTORY ${BINARY_DIR})
54FILE(MAKE_DIRECTORY ${BINARY_CLASS_DIR})
55FILE(MAKE_DIRECTORY ${JAR_DIR})
56FILE(MAKE_DIRECTORY ${TEST_CLASS_DIR})
57
58## Sikuli IDE
59
60SET(MAIN_CLASS org.sikuli.ide.SikuliIDE)
61SET(RUN_USER_ARGS -Dsikuli.console=true -Dfile.encoding=UTF-8
62 -Dsikuli.testing=yes
63 -Xms64m -Xmx512m
64 CACHE STRING
65 "The arguments for running Sikuli IDE with 'make run-user'"
66)
67SET(RUN_ARGS -Dsikuli.console=false -Dsikuli.Debug=3 -Dfile.encoding=UTF-8
68 -Dsikuli.testing=yes
69 -Xms64m -Xmx512m
70 #-Duser.language=zh -Duser.region=TW
71 CACHE STRING
72 "The arguments for running Sikuli IDE with 'make run'"
73)
74IF(APPLE)
75 LIST(APPEND RUN_ARGS -Xdock:name='Sikuli IDE')
76ENDIF()
77
78#SET(ARGS -s -r ../sample-scripts/mod1.sikuli --args a1 a2) # example args
79SET(ARGS "")
80
81SET(CLASSPATH
82 ${SIKULI_SCRIPT_JAR}${SEP}${JUNIT_JAR}${SEP}${SWING_LAYOUT_JAR}${SEP}${COMMONS_CLI_JAR}${SEP}${JSON_SIMPLE_JAR}${SEP}${SWINGX_JAR}${SEP}${MAC_WIDGETS_JAR}${SEP}${FORMS_JAR}${SEP}/usr/share/java/jython.jar
83)
84
85SET(JAR_FILE sikuli-ide.jar)
86SET(RESOURCES icons META-INF scripts i18n)
87
88IF(LINUX)
89 SET(MANIFEST ${RESOURCE_DIR}/META-INF/MANIFEST-linux.MF)
90 #SET(CLASSPATH ${CLASSPATH}${SEP}${JXGRABKEY_JAR})
91ELSEIF(WIN32)
92 SET(MANIFEST ${RESOURCE_DIR}/META-INF/MANIFEST-win32.MF)
93 #SET(CLASSPATH ${CLASSPATH}${SEP}${JINTELLITYPE_JAR})
94ELSE()
95 SET(MANIFEST ${RESOURCE_DIR}/META-INF/MANIFEST.MF)
96ENDIF()
97
98
99add_custom_target( ${JAR_FILE}
100 COMMAND ${JAVA_ARCHIVE} cfm ${BINARY_DIR}/${JAR_FILE}
101 ${MANIFEST} -C ${JAR_DIR} *
102 COMMAND ${CMAKE_COMMAND} -E copy ${BINARY_DIR}/${JAR_FILE} ${COMMON_LIB_DIR}/${JAR_FILE}
103 COMMENT "Packaging ${JAR_FILE}"
104 WORKING_DIRECTORY ${JAR_DIR}
105)
106
107add_custom_target( ${JAR_FILE}.resources
108 COMMAND ${CMAKE_COMMAND} -E copy_directory ${RESOURCE_DIR} ${JAR_DIR}
109 COMMENT "Copying IDE resources"
110)
111
112add_custom_target( ${JAR_FILE}.prepare
113 COMMENT "Preparing ${JAR_FILE}"
114)
115
116add_custom_target( run-user
117 COMMAND ${JAVA_RUNTIME} ${RUN_USER_ARGS}
118 -classpath "${CLASSPATH}${SEP}${JAR_DIR}"
119 ${MAIN_CLASS} ${ARGS}
120)
121
122add_custom_target( run
123 COMMAND ${JAVA_RUNTIME} ${RUN_ARGS}
124 -classpath "${CLASSPATH}${SEP}${JAR_DIR}"
125 ${MAIN_CLASS} ${ARGS}
126)
127
128if(NOT DEFINED SIKULI_VERSION OR SIKULI_VERSION STREQUAL "")
129 file(READ ${BASE_DIR}/latest-ver SIKULI_VERSION)
130 STRING(STRIP ${SIKULI_VERSION} SIKULI_VERSION)
131ENDIF()
132message("Sikuli Version ${SIKULI_VERSION}")
133
134SET(JYTHON_CLASS org.python.util.jython)
135add_custom_target( update-version
136 COMMAND ${JAVA_RUNTIME} -cp "${CLASSPATH}" ${JYTHON_CLASS} ${BASE_DIR}/../utils/update-version.py ${JAVA_SRC_DIR}/org/sikuli/ide/IDESettings.java "${SIKULI_VERSION}"
137 COMMENT "Update version number in Sikuli-IDE"
138)
139
140SET(INCLUDE_JARS ${SIKULI_SCRIPT_JAR} ${JUNIT_JAR}
141 ${SWING_LAYOUT_JAR} ${COMMONS_CLI_JAR}
142 ${BINARY_DIR}/${JAR_FILE} ${JSON_SIMPLE_JAR}
143 ${SWINGX_JAR} ${MAC_WIDGETS_JAR} ${FORMS_JAR}
144)
145
146## Windows Package
147
148IF(WIN32)
149 SET(OS "win32")
150 SET(APP_FILE "Sikuli-IDE")
151 SET(BINARY_APP_DIR "${BINARY_DIR}/${OS}")
152 SET(JAR_IN_APP_DIR ${BINARY_APP_DIR}/${APP_FILE})
153 SET(FRAMEWORKS_IN_APP_DIR ${JAR_IN_APP_DIR}/libs)
154 SET(JAR_LIB_DIR ${JAR_DIR}/META-INF/lib)
155
156 #LIST(APPEND INCLUDE_JARS ${JINTELLITYPE_JAR})
157 FILE(GLOB sikuli_script_jnilibs "${BASE_DIR}/../sikuli-script/target/lib/*.dll")
158 SET(jnilibs ${sikuli_script_jnilibs})
159ENDIF()
160
161## Linux Package
162
163IF(LINUX)
164 SET(OS "linux")
165 SET(APP_FILE "Sikuli-IDE")
166 SET(BINARY_APP_DIR "${BINARY_DIR}/${OS}")
167 SET(JAR_IN_APP_DIR ${BINARY_APP_DIR}/${APP_FILE})
168 SET(FRAMEWORKS_IN_APP_DIR ${JAR_IN_APP_DIR}/libs)
169 SET(JAR_LIB_DIR ${JAR_DIR}/META-INF/lib)
170
171 #LIST(APPEND INCLUDE_JARS ${JXGRABKEY_JAR})
172 SET(jnilibs "")
173 FILE(GLOB sikuli_script_jnilibs "${BASE_DIR}/../sikuli-script/target/lib/*.so")
174 LIST(APPEND jnilibs ${sikuli_script_jnilibs})
175ENDIF(LINUX)
176
177## Sikuli-IDE.App for Mac OS X
178
179IF(APPLE)
180 IF(APPLE_SNOW_LEOPARD)
181 SET(OSX_VER "osx-10.6")
182 ELSEIF(APPLE_LEOPARD)
183 SET(OSX_VER "osx-10.5")
184 ENDIF()
185 SET(OS ${OSX_VER})
186
187 SET(APP_FILE "Sikuli-IDE.app")
188 SET(BINARY_APP_DIR "${BINARY_DIR}/${OS}")
189 SET(JAR_IN_APP_DIR ${BINARY_APP_DIR}/${APP_FILE}/Contents/Resources/Java)
190 SET(FRAMEWORKS_IN_APP_DIR ${BINARY_APP_DIR}/${APP_FILE}/Contents/Frameworks)
191
192 FIND_PACKAGE(OpenCV REQUIRED)
193 #message("opencv lib: ${OpenCV_LIB_DIR}")
194 LIST(APPEND CMAKE_LIBRARY_PATH ${OpenCV_LIB_DIR})
195
196 FILE(GLOB jnilibs "${BINARY_LIB_DIR}/*.jnilib")
197 FILE(GLOB sikuli_script_jnilibs "${BASE_DIR}/../sikuli-script/target/lib/*.jnilib")
198 LIST(APPEND jnilibs ${sikuli_script_jnilibs})
199
200 find_dep_libs("${jnilibs}" deplibs)
201 find_dep_libs("${deplibs}" deplibs)
202 #MESSAGE("Dep: ${deplibs}")
203
204ENDIF(APPLE)
205
206SET(RELEASE_FILE "Sikuli-${SIKULI_VERSION}-${OS}")
207
208## Packaging App
209add_custom_target( ${APP_FILE}
210 COMMENT "Generate ${BINARY_DIR}/${APP_FILE}"
211)
212
213add_dependencies( ${APP_FILE} ${JAR_FILE} )
214
215IF(LINUX)
216 EXEC_PROGRAM(uname ARGS -m OUTPUT_VARIABLE SYSTEM_ARCH)
217 SET(RELEASE_FILE "${RELEASE_FILE}-${SYSTEM_ARCH}")
218 if(SYSTEM_ARCH MATCHES "x86_64")
219 SET(LIB_GRABKEY "${COMMON_LIB_DIR}/jxgrabkey/lib/libJXGrabKey-64.so")
220 else()
221 SET(LIB_GRABKEY "${COMMON_LIB_DIR}/jxgrabkey/lib/libJXGrabKey-32.so")
222 endif()
223
224 add_custom_target( ${APP_FILE}.framework
225 COMMAND ${CMAKE_COMMAND} -E make_directory ${FRAMEWORKS_IN_APP_DIR}
226 COMMAND cp ${jnilibs} ${FRAMEWORKS_IN_APP_DIR}
227 COMMENT "Packaging Frameworks in App"
228 )
229 add_dependencies( ${APP_FILE} ${APP_FILE}.framework )
230
231ENDIF(LINUX)
232
233IF(WIN32)
234 SET(APP_FILES Sikuli-IDE-w.bat Sikuli-IDE.bat Sikuli-IDE.exe ide-icon.ico)
235 SET(WIN32_LIBS ${COMMON_LIB_DIR}/win32)
236 SET(OPENCV_LIBS cv210 cvaux210 cxcore210 highgui210 ml210)
237
238 SET(LIB_GRABKEY "${COMMON_LIB_DIR}/jintellitype-1.3.6/JIntellitype.dll")
239 add_custom_target( ${JAR_FILE}.framework
240 COMMAND ${CMAKE_COMMAND} -E make_directory ${JAR_LIB_DIR}
241 #COMMAND ${CMAKE_COMMAND} -E copy ${LIB_GRABKEY} ${JAR_LIB_DIR}/
242 COMMENT "Packaging Frameworks in Jar"
243 )
244 add_dependencies( ${JAR_FILE} ${JAR_FILE}.framework )
245
246 add_custom_target( ${APP_FILE}.framework
247 COMMAND ${CMAKE_COMMAND} -E make_directory ${FRAMEWORKS_IN_APP_DIR}
248 COMMAND ${CMAKE_COMMAND} -E copy_directory ${WIN32_LIBS} ${FRAMEWORKS_IN_APP_DIR}
249 COMMENT "Packaging Frameworks in App"
250 )
251 add_dependencies( ${APP_FILE} ${APP_FILE}.framework )
252
253 #libs
254
255 install(FILES ${jnilibs}
256 DESTINATION ${FRAMEWORKS_IN_APP_DIR})
257 FOREACH(F ${OPENCV_LIBS})
258 install(FILES ${OpenCV_DIR}/bin/${F}.dll
259 DESTINATION ${FRAMEWORKS_IN_APP_DIR})
260 ENDFOREACH()
261
262 FOREACH(F ${APP_FILES})
263 install(FILES ${BINARY_APP_DIR}/${F}
264 DESTINATION ${JAR_IN_APP_DIR})
265
266 ENDFOREACH()
267ENDIF(WIN32)
268
269IF(APPLE)
270 add_custom_target( ${APP_FILE}.framework
271 COMMAND ${CMAKE_COMMAND} -E make_directory ${FRAMEWORKS_IN_APP_DIR}
272 COMMAND cp -f ${jnilibs} ${FRAMEWORKS_IN_APP_DIR}
273 COMMAND cp -f ${deplibs} ${FRAMEWORKS_IN_APP_DIR}
274 COMMAND ${CMAKE_COMMAND} -E chdir ${FRAMEWORKS_IN_APP_DIR} ./change-lib-path.sh
275 COMMENT "Packaging Frameworks"
276 )
277
278 add_custom_target( ${APP_FILE}.update_ver
279 COMMAND defaults write ${BINARY_APP_DIR}/${APP_FILE}/Contents/Info CFBundleVersion `echo ${SIKULI_VERSION} | awk '{print $$1}'`
280 COMMAND plutil -convert xml1 ${BINARY_APP_DIR}/${APP_FILE}/Contents/Info.plist
281 )
282
283 add_dependencies( ${APP_FILE} ${APP_FILE}.framework ${APP_FILE}.update_ver)
284
285ENDIF(APPLE)
286
287install(DIRECTORY ${BINARY_APP_DIR}/${APP_FILE}
288 USE_SOURCE_PERMISSIONS
289 DESTINATION .
290)
291
292
293add_custom_target( app ALL
294)
295
296
297FOREACH(JAR ${INCLUDE_JARS})
298 get_filename_component(JAR_FILENAME ${JAR} NAME)
299 get_filename_component(target ${JAR} NAME_WE)
300 set(target "include_${target}")
301 add_custom_target( ${target}
302 COMMAND ${CMAKE_COMMAND} -E copy ${JAR} ${JAR_IN_APP_DIR}/${JAR_FILENAME}
303
304 COMMENT "Copying ${JAR_FILENAME}"
305 )
306 add_dependencies( ${APP_FILE} ${target} )
307ENDFOREACH(JAR ${INCLUDE_JARS})
308
309
310add_dependencies( app ${APP_FILE})
311
312## Language files
313
314add_custom_target( update-po
315 COMMAND prop2po ${RESOURCE_DIR}/i18n/IDE_en_US.properties > ${RESOURCE_DIR}/i18n/IDE/IDE.pot
316
317 COMMENT "Update the IDE.pot file"
318)
319
320add_custom_target( update-prop
321 COMMAND ${BASE_DIR}/../utils/update-prop.sh ${RESOURCE_DIR}
322 COMMENT "Update the IDE language properties."
323)
324
325
326## Packaging
327
328if(APPLE)
329 SET(CPACK_GENERATOR DragNDrop )
330 # SET(CPACK_GENERATOR ZIP )
331else(APPLE)
332 SET(CPACK_GENERATOR
333 ZIP
334 )
335endif(APPLE)
336
337SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sikuli ${SIKULI_VERSION}")
338SET(CPACK_PACKAGE_VENDOR "Sikuli Development Team")
339SET(CPACK_PACKAGE_DESCRIPTION_FILE "${BASE_DIR}/../readme.txt")
340SET(CPACK_RESOURCE_FILE_LICENSE "${BASE_DIR}/../copyright.txt")
341SET(CPACK_PACKAGE_FILE_NAME ${RELEASE_FILE})
342
343INCLUDE(CPack)
344
345install(FILES
346 ${CPACK_PACKAGE_DESCRIPTION_FILE}
347 ${CPACK_RESOURCE_FILE_LICENSE}
348 DESTINATION .
349)
350
351# type "make package" to generate release packages
352
353
354## tests
355
356SET(MAIN_TEST_SUITE ${PACKAGE}.SikuliIDETestSuite)
357
358add_custom_target( java-test.test-res
359 COMMAND ${CMAKE_COMMAND} -E copy_directory ${BASE_DIR}/${TEST_RESOURCE_DIR} ${CMAKE_BINARY_DIR}/${TEST_RESOURCE_DIR}
360 COMMENT "Copy test resource"
361)
362
363add_custom_target( java-test
364 # COMMAND ${JAVA_RUNTIME} -cp ${TEST_CLASS_DIR}${SEP}${BINARY_DIR}/${JAR_FILE}${SEP}${JUNIT_JAR} junit.textui.TestRunner ${MAIN_TEST_SUITE}
365 COMMAND ant -f ${JAVA_TEST_FOR_HUDSON_XML}
366 COMMENT "Run Java unit tests"
367)
368
369add_dependencies( java-test
370 ${JAR_FILE}
371 ${PROJECT_NAME}.test.classes
372 java-test.test-res
373)
374
375add_custom_target( all-test
376)
377
378add_dependencies( all-test
379 java-test
380)
381
382## Dependencies
383
384add_dependencies( ${JAR_FILE}.prepare
385 ${JAR_FILE}.resources
386 ${JAR_FILE}.classes-in-jar
387 # ${JAR_FILE}.libs-in-jar
388)
389
390add_dependencies( ${JAR_FILE} ${JAR_FILE}.prepare )
391add_dependencies( run-user ${JAR_FILE})
392add_dependencies( run ${JAR_FILE})
393add_dependencies( app ${APP_FILE})
394
395
396ADD_SUBDIRECTORY( ${JAVA_SRC_DIR} )
397#ADD_SUBDIRECTORY( ${NATIVE_SRC_DIR} )
398ADD_SUBDIRECTORY( ${JAVA_TEST_DIR} )
399
400
401
402SET(SIKULI_VERSION CACHE INTERNAL "" FORCE)
403
4040
=== removed directory '.pc/gcc-4.7.patch'
=== removed directory '.pc/gcc-4.7.patch/sikuli-script'
=== removed directory '.pc/gcc-4.7.patch/sikuli-script/src'
=== removed directory '.pc/gcc-4.7.patch/sikuli-script/src/main'
=== removed directory '.pc/gcc-4.7.patch/sikuli-script/src/main/native'
=== removed file '.pc/gcc-4.7.patch/sikuli-script/src/main/native/sikuli-debug.h'
--- .pc/gcc-4.7.patch/sikuli-script/src/main/native/sikuli-debug.h 2012-05-11 23:51:05 +0000
+++ .pc/gcc-4.7.patch/sikuli-script/src/main/native/sikuli-debug.h 1970-01-01 00:00:00 +0000
@@ -1,52 +0,0 @@
1/*
2 * Copyright 2010-2011, Sikuli.org
3 * Released under the MIT License.
4 *
5 */
6#ifndef _SIKULU_DEBUG_H
7#define _SIKULI_DEBUG_H
8
9
10#include <streambuf>
11#include <ostream>
12
13namespace sikuli{
14 enum DebugCategories {
15 OCR, FINDER
16 };
17 void setDebug(DebugCategories cat, int level);
18
19 extern int OCR_DEBUG_LEVEL;
20 extern int FINDER_DEBUG_LEVEL;
21
22 template <class cT, class traits = std::char_traits<cT> >
23 class basic_nullbuf: public std::basic_streambuf<cT, traits> {
24 typename traits::int_type overflow(typename traits::int_type c)
25 {
26 return traits::not_eof(c); // indicate success
27 }
28 };
29
30 template <class cT, class traits = std::char_traits<cT> >
31 class basic_onullstream: public std::basic_ostream<cT, traits> {
32 public:
33 basic_onullstream():
34 std::basic_ios<cT, traits>(&m_sbuf),
35 std::basic_ostream<cT, traits>(&m_sbuf)
36 {
37 init(&m_sbuf);
38 }
39
40 private:
41 basic_nullbuf<cT, traits> m_sbuf;
42 };
43
44 typedef basic_onullstream<char> onullstream;
45 typedef basic_onullstream<wchar_t> wonullstream;
46
47 std::ostream& dout(const char* name="");
48 std::ostream& dhead(const char* name);
49
50}
51
52#endif
530
=== removed directory '.pc/install-extension.patch'
=== removed directory '.pc/install-extension.patch/sikuli-script'
=== removed directory '.pc/install-extension.patch/sikuli-script/src'
=== removed directory '.pc/install-extension.patch/sikuli-script/src/main'
=== removed directory '.pc/install-extension.patch/sikuli-script/src/main/java'
=== removed directory '.pc/install-extension.patch/sikuli-script/src/main/java/org'
=== removed directory '.pc/install-extension.patch/sikuli-script/src/main/java/org/sikuli'
=== removed directory '.pc/install-extension.patch/sikuli-script/src/main/java/org/sikuli/script'
=== removed file '.pc/install-extension.patch/sikuli-script/src/main/java/org/sikuli/script/ExtensionManager.java'
--- .pc/install-extension.patch/sikuli-script/src/main/java/org/sikuli/script/ExtensionManager.java 2011-10-04 00:57:09 +0000
+++ .pc/install-extension.patch/sikuli-script/src/main/java/org/sikuli/script/ExtensionManager.java 1970-01-01 00:00:00 +0000
@@ -1,175 +0,0 @@
1/*
2 * Copyright 2010-2011, Sikuli.org
3 * Released under the MIT License.
4 *
5 */
6package org.sikuli.script;
7
8import java.io.*;
9import java.net.URL;
10import java.util.ArrayList;
11
12class Extension implements Serializable{
13 public String name;
14 public String url;
15 public String version;
16
17 public Extension(String name_, String url_, String version_){
18 name = name_;
19 url = url_;
20 version = version_;
21 }
22}
23
24public class ExtensionManager {
25 protected final static String EXT_LIST_FILE = ".ext-list";
26 protected static ExtensionManager _instance = null;
27 protected File _extListFile;
28 protected ArrayList<Extension> _extensions;
29
30 public static ExtensionManager getInstance(){
31 if(_instance == null)
32 _instance = new ExtensionManager();
33 return _instance;
34 }
35
36 protected void readExtList() {
37 try{
38 FileInputStream fis = new FileInputStream(_extListFile);
39 ObjectInputStream in = new ObjectInputStream(fis);
40 _extensions = (ArrayList<Extension>)in.readObject();
41 in.close();
42 }
43 catch(Exception e){
44 _extensions = new ArrayList<Extension>();
45 }
46 }
47
48 protected void updateExtList() throws IOException, ClassNotFoundException{
49 FileOutputStream fos = new FileOutputStream(_extListFile);
50 ObjectOutputStream out = new ObjectOutputStream(fos);
51 out.writeObject(_extensions);
52 out.close();
53 }
54
55 protected ExtensionManager(){
56 _extListFile = new File(getUserExtPath(),EXT_LIST_FILE);
57 readExtList();
58 }
59
60
61 protected Extension find(String name){
62 for(Extension e : _extensions){
63 if(e.name.equals(name))
64 return e;
65 }
66 return null;
67 }
68
69 protected void addExtension(String name, String url, String version){
70
71 // remove the previously installed extension of the same name
72 Extension old_ext = find(name);
73 if (old_ext != null)
74 _extensions.remove(old_ext);
75
76 Extension ext = new Extension(name, url, version);
77 _extensions.add(ext);
78
79 try{
80 updateExtList();
81 }
82 catch(Exception e){
83 e.printStackTrace();
84 }
85 }
86
87
88 public String getVersion(String name){
89 Extension e = find(name);
90 if (e != null){
91 return e.version;
92 }else{
93 return null;
94 }
95 }
96
97 public boolean isOutOfDate(String name, String version){
98 Extension e = find(name);
99 if (e == null){
100 return false;
101 }else{
102 String s1 = normalisedVersion(e.version); // installed version
103 String s2 = normalisedVersion(version); // version number to check
104 int cmp = s1.compareTo(s2);
105 return cmp < 0;
106 }
107 }
108
109 public boolean isInstalled(String name){
110 Extension e = find(name);
111 return e != null;
112 }
113
114 private String getExtName(String nameWithVer){
115 int verSep = nameWithVer.lastIndexOf("-");
116 if(verSep>=0){
117 return nameWithVer.substring(0, verSep) + ".jar";
118 }
119 return nameWithVer;
120 }
121
122 /**
123 * install a Sikuli extension (.JAR)
124 */
125 public boolean install(String name, String url_, String version_){
126 String extPath = getUserExtPath();
127 String tmpdir = System.getProperty("java.io.tmpdir");
128 try{
129 URL url = new URL(url_);
130 File localFile = new File(Util.downloadURL(url, tmpdir));
131 String extName = getExtName(localFile.getName());
132 File targetFile = new File(extPath, extName);
133 if(targetFile.exists())
134 targetFile.delete();
135 if( !localFile.renameTo(targetFile) ){
136 Debug.error("Failed to install " + localFile.getName() + " to " + targetFile.getAbsolutePath());
137 return false;
138 }
139 addExtension(name, url_, version_);
140 }
141 catch(IOException e){
142 Debug.error("Failed to download " + url_);
143 e.printStackTrace();
144 return false;
145 }
146 return true;
147 }
148
149 /**
150 * returns the absolute path to the user's extension path
151 */
152 public String getUserExtPath(){
153 String ret = Env.getSikuliDataPath() + File.separator + "extensions";
154 File f = new File(ret);
155 if(!f.exists())
156 f.mkdirs();
157 return ret;
158 }
159
160
161
162 public static String normalisedVersion(String version) {
163 return normalisedVersion(version, ".", 4);
164 }
165
166 public static String normalisedVersion(String version, String sep, int maxWidth) {
167 String[] split = java.util.regex.Pattern.compile(sep, java.util.regex.Pattern.LITERAL).split(version);
168 StringBuilder sb = new StringBuilder();
169 for (String s : split) {
170 sb.append(String.format("%" + maxWidth + 's', s));
171 }
172 return sb.toString();
173 }
174
175}
1760
=== removed directory '.pc/jgoodies-1.6-compat.patch'
=== removed directory '.pc/jgoodies-1.6-compat.patch/sikuli-ide'
=== removed file '.pc/jgoodies-1.6-compat.patch/sikuli-ide/CMakeLists.txt'
--- .pc/jgoodies-1.6-compat.patch/sikuli-ide/CMakeLists.txt 2012-12-07 22:13:08 +0000
+++ .pc/jgoodies-1.6-compat.patch/sikuli-ide/CMakeLists.txt 1970-01-01 00:00:00 +0000
@@ -1,405 +0,0 @@
1# Copyright 2010-2011, Sikuli.org
2# Released under the MIT License.
3CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
4PROJECT (sikuli-ide Java)
5
6SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../cmake_modules")
7INCLUDE(${CMAKE_MODULE_PATH}/common.cmake)
8INCLUDE(${CMAKE_MODULE_PATH}/detect_osx_ver.cmake)
9INCLUDE(${CMAKE_MODULE_PATH}/find_dep_libs.cmake)
10
11
12ENABLE_TESTING()
13
14SET(CMAKE_VERBOSE_MAKEFILE 0)
15
16FIND_PACKAGE(Java 1.6 REQUIRED)
17SET( NON_NATIVE_TARGET TRUE)
18
19IF(UNIX)
20 SET(SEP ":")
21ELSE()
22 SET(SEP ";")
23ENDIF()
24
25
26SET(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
27SET(JAVA_SRC_DIR "${BASE_DIR}/src/main/java")
28SET(NATIVE_SRC_DIR "${BASE_DIR}/src/main/native")
29SET(COMMON_LIB_DIR "${BASE_DIR}/../lib")
30SET(INCLUDE_LIB_DIR "${BASE_DIR}/lib")
31SET(BINARY_DIR "${BASE_DIR}/target")
32SET(BINARY_CLASS_DIR "${BINARY_DIR}/classes")
33SET(BINARY_LIB_DIR "${BINARY_DIR}/lib")
34SET(JAR_DIR "${BINARY_DIR}/jar")
35SET(RESOURCE_DIR "${BASE_DIR}/resources")
36SET(RELEASE_DIR "${BASE_DIR}/../release")
37
38SET(JAVA_TEST_DIR "${BASE_DIR}/src/test/java")
39SET(TEST_RESOURCE_DIR "test-res")
40SET(JAVA_TEST_FOR_HUDSON_XML "../hudson-test.xml")
41SET(TEST_CLASS_DIR "${CMAKE_BINARY_DIR}/test")
42
43SET(SIKULI_SCRIPT_JAR "${COMMON_LIB_DIR}/sikuli-script.jar")
44SET(JUNIT_JAR "/usr/share/java/junit.jar")
45SET(SWING_LAYOUT_JAR "/usr/share/java/swing-layout.jar")
46SET(COMMONS_CLI_JAR "/usr/share/java/commons-cli.jar")
47SET(JSON_SIMPLE_JAR "/usr/share/java/json_simple.jar")
48SET(SWINGX_JAR "/usr/share/java/swingx-core.jar")
49SET(MAC_WIDGETS_JAR "/usr/share/java/mac_widgets.jar")
50SET(FORMS_JAR "/usr/share/java/forms.jar")
51
52
53FILE(MAKE_DIRECTORY ${BINARY_DIR})
54FILE(MAKE_DIRECTORY ${BINARY_CLASS_DIR})
55FILE(MAKE_DIRECTORY ${JAR_DIR})
56FILE(MAKE_DIRECTORY ${TEST_CLASS_DIR})
57
58## Sikuli IDE
59
60SET(MAIN_CLASS org.sikuli.ide.SikuliIDE)
61SET(RUN_USER_ARGS -Dsikuli.console=true -Dfile.encoding=UTF-8
62 -Dsikuli.testing=yes
63 -Xms64m -Xmx512m
64 CACHE STRING
65 "The arguments for running Sikuli IDE with 'make run-user'"
66)
67SET(RUN_ARGS -Dsikuli.console=false -Dsikuli.Debug=3 -Dfile.encoding=UTF-8
68 -Dsikuli.testing=yes
69 -Xms64m -Xmx512m
70 #-Duser.language=zh -Duser.region=TW
71 CACHE STRING
72 "The arguments for running Sikuli IDE with 'make run'"
73)
74IF(APPLE)
75 LIST(APPEND RUN_ARGS -Xdock:name='Sikuli IDE')
76ENDIF()
77
78#SET(ARGS -s -r ../sample-scripts/mod1.sikuli --args a1 a2) # example args
79SET(ARGS "")
80
81SET(CLASSPATH
82 ${SIKULI_SCRIPT_JAR}${SEP}${JUNIT_JAR}${SEP}${SWING_LAYOUT_JAR}${SEP}${COMMONS_CLI_JAR}${SEP}${JSON_SIMPLE_JAR}${SEP}${SWINGX_JAR}${SEP}${MAC_WIDGETS_JAR}${SEP}${FORMS_JAR}${SEP}/usr/share/java/jython.jar
83)
84
85SET(JAR_FILE sikuli-ide.jar)
86SET(RESOURCES icons META-INF scripts i18n)
87
88IF(LINUX)
89 SET(MANIFEST ${RESOURCE_DIR}/META-INF/MANIFEST-linux.MF)
90 #SET(CLASSPATH ${CLASSPATH}${SEP}${JXGRABKEY_JAR})
91ELSEIF(WIN32)
92 SET(MANIFEST ${RESOURCE_DIR}/META-INF/MANIFEST-win32.MF)
93 #SET(CLASSPATH ${CLASSPATH}${SEP}${JINTELLITYPE_JAR})
94ELSE()
95 SET(MANIFEST ${RESOURCE_DIR}/META-INF/MANIFEST.MF)
96ENDIF()
97
98
99add_custom_target( ${JAR_FILE}
100 COMMAND ${JAVA_ARCHIVE} cfm ${BINARY_DIR}/${JAR_FILE}
101 ${MANIFEST} -C ${JAR_DIR} *
102 COMMAND ${CMAKE_COMMAND} -E copy ${BINARY_DIR}/${JAR_FILE} ${COMMON_LIB_DIR}/${JAR_FILE}
103 COMMENT "Packaging ${JAR_FILE}"
104 WORKING_DIRECTORY ${JAR_DIR}
105)
106
107add_custom_target( ${JAR_FILE}.resources
108 COMMAND ${CMAKE_COMMAND} -E copy_directory ${RESOURCE_DIR} ${JAR_DIR}
109 COMMENT "Copying IDE resources"
110)
111
112add_custom_target( ${JAR_FILE}.prepare
113 COMMENT "Preparing ${JAR_FILE}"
114)
115
116add_custom_target( run-user
117 COMMAND ${JAVA_RUNTIME} ${RUN_USER_ARGS}
118 -classpath "${CLASSPATH}${SEP}${JAR_DIR}"
119 ${MAIN_CLASS} ${ARGS}
120)
121
122add_custom_target( run
123 COMMAND ${JAVA_RUNTIME} ${RUN_ARGS}
124 -classpath "${CLASSPATH}${SEP}${JAR_DIR}"
125 ${MAIN_CLASS} ${ARGS}
126)
127
128if(NOT DEFINED SIKULI_VERSION OR SIKULI_VERSION STREQUAL "")
129 file(READ ${BASE_DIR}/latest-ver SIKULI_VERSION)
130 STRING(STRIP ${SIKULI_VERSION} SIKULI_VERSION)
131ENDIF()
132message("Sikuli Version ${SIKULI_VERSION}")
133
134SET(JYTHON_CLASS org.python.util.jython)
135add_custom_target( update-version
136 COMMAND ${JAVA_RUNTIME} -cp "${CLASSPATH}" ${JYTHON_CLASS} ${BASE_DIR}/../utils/update-version.py ${JAVA_SRC_DIR}/org/sikuli/ide/IDESettings.java "${SIKULI_VERSION}"
137 COMMENT "Update version number in Sikuli-IDE"
138)
139
140SET(INCLUDE_JARS ${SIKULI_SCRIPT_JAR} ${JUNIT_JAR}
141 ${SWING_LAYOUT_JAR} ${COMMONS_CLI_JAR}
142 ${BINARY_DIR}/${JAR_FILE} ${JSON_SIMPLE_JAR}
143 ${SWINGX_JAR} ${MAC_WIDGETS_JAR} ${FORMS_JAR}
144)
145
146## Windows Package
147
148IF(WIN32)
149 SET(OS "win32")
150 SET(APP_FILE "Sikuli-IDE")
151 SET(BINARY_APP_DIR "${BINARY_DIR}/${OS}")
152 SET(JAR_IN_APP_DIR ${BINARY_APP_DIR}/${APP_FILE})
153 SET(FRAMEWORKS_IN_APP_DIR ${JAR_IN_APP_DIR}/libs)
154 SET(JAR_LIB_DIR ${JAR_DIR}/META-INF/lib)
155
156 #LIST(APPEND INCLUDE_JARS ${JINTELLITYPE_JAR})
157 FILE(GLOB sikuli_script_jnilibs "${BASE_DIR}/../sikuli-script/target/lib/*.dll")
158 SET(jnilibs ${sikuli_script_jnilibs})
159ENDIF()
160
161## Linux Package
162
163IF(LINUX)
164 SET(OS "linux")
165 SET(APP_FILE "Sikuli-IDE")
166 SET(BINARY_APP_DIR "${BINARY_DIR}/${OS}")
167 SET(JAR_IN_APP_DIR ${BINARY_APP_DIR}/${APP_FILE})
168 SET(FRAMEWORKS_IN_APP_DIR ${JAR_IN_APP_DIR}/libs)
169 SET(JAR_LIB_DIR ${JAR_DIR}/META-INF/lib)
170
171 #LIST(APPEND INCLUDE_JARS ${JXGRABKEY_JAR})
172 SET(jnilibs "")
173 FILE(GLOB sikuli_script_jnilibs "${BASE_DIR}/../sikuli-script/target/lib/*.so")
174 LIST(APPEND jnilibs ${sikuli_script_jnilibs})
175ENDIF(LINUX)
176
177## Sikuli-IDE.App for Mac OS X
178
179IF(APPLE)
180 IF(APPLE_SNOW_LEOPARD)
181 SET(OSX_VER "osx-10.6")
182 ELSEIF(APPLE_LEOPARD)
183 SET(OSX_VER "osx-10.5")
184 ENDIF()
185 SET(OS ${OSX_VER})
186
187 SET(APP_FILE "Sikuli-IDE.app")
188 SET(BINARY_APP_DIR "${BINARY_DIR}/${OS}")
189 SET(JAR_IN_APP_DIR ${BINARY_APP_DIR}/${APP_FILE}/Contents/Resources/Java)
190 SET(FRAMEWORKS_IN_APP_DIR ${BINARY_APP_DIR}/${APP_FILE}/Contents/Frameworks)
191
192 FIND_PACKAGE(OpenCV REQUIRED)
193 #message("opencv lib: ${OpenCV_LIB_DIR}")
194 LIST(APPEND CMAKE_LIBRARY_PATH ${OpenCV_LIB_DIR})
195
196 FILE(GLOB jnilibs "${BINARY_LIB_DIR}/*.jnilib")
197 FILE(GLOB sikuli_script_jnilibs "${BASE_DIR}/../sikuli-script/target/lib/*.jnilib")
198 LIST(APPEND jnilibs ${sikuli_script_jnilibs})
199
200 find_dep_libs("${jnilibs}" deplibs)
201 find_dep_libs("${deplibs}" deplibs)
202 #MESSAGE("Dep: ${deplibs}")
203
204ENDIF(APPLE)
205
206SET(RELEASE_FILE "Sikuli-${SIKULI_VERSION}-${OS}")
207
208## Packaging App
209add_custom_target( ${APP_FILE}
210 COMMENT "Generate ${BINARY_DIR}/${APP_FILE}"
211)
212
213add_dependencies( ${APP_FILE} ${JAR_FILE} )
214
215IF(LINUX)
216 EXEC_PROGRAM(uname ARGS -m OUTPUT_VARIABLE SYSTEM_ARCH)
217 SET(RELEASE_FILE "${RELEASE_FILE}-${SYSTEM_ARCH}")
218 if(SYSTEM_ARCH MATCHES "x86_64")
219 SET(LIB_GRABKEY "${COMMON_LIB_DIR}/jxgrabkey/lib/libJXGrabKey-64.so")
220 else()
221 SET(LIB_GRABKEY "${COMMON_LIB_DIR}/jxgrabkey/lib/libJXGrabKey-32.so")
222 endif()
223
224 add_custom_target( ${APP_FILE}.framework
225 COMMAND ${CMAKE_COMMAND} -E make_directory ${FRAMEWORKS_IN_APP_DIR}
226 COMMAND cp ${jnilibs} ${FRAMEWORKS_IN_APP_DIR}
227 COMMENT "Packaging Frameworks in App"
228 )
229 add_dependencies( ${APP_FILE} ${APP_FILE}.framework )
230
231ENDIF(LINUX)
232
233IF(WIN32)
234 SET(APP_FILES Sikuli-IDE-w.bat Sikuli-IDE.bat Sikuli-IDE.exe ide-icon.ico)
235 SET(WIN32_LIBS ${COMMON_LIB_DIR}/win32)
236 SET(OPENCV_LIBS cv210 cvaux210 cxcore210 highgui210 ml210)
237
238 SET(LIB_GRABKEY "${COMMON_LIB_DIR}/jintellitype-1.3.6/JIntellitype.dll")
239 add_custom_target( ${JAR_FILE}.framework
240 COMMAND ${CMAKE_COMMAND} -E make_directory ${JAR_LIB_DIR}
241 #COMMAND ${CMAKE_COMMAND} -E copy ${LIB_GRABKEY} ${JAR_LIB_DIR}/
242 COMMENT "Packaging Frameworks in Jar"
243 )
244 add_dependencies( ${JAR_FILE} ${JAR_FILE}.framework )
245
246 add_custom_target( ${APP_FILE}.framework
247 COMMAND ${CMAKE_COMMAND} -E make_directory ${FRAMEWORKS_IN_APP_DIR}
248 COMMAND ${CMAKE_COMMAND} -E copy_directory ${WIN32_LIBS} ${FRAMEWORKS_IN_APP_DIR}
249 COMMENT "Packaging Frameworks in App"
250 )
251 add_dependencies( ${APP_FILE} ${APP_FILE}.framework )
252
253 #libs
254
255 install(FILES ${jnilibs}
256 DESTINATION ${FRAMEWORKS_IN_APP_DIR})
257 FOREACH(F ${OPENCV_LIBS})
258 install(FILES ${OpenCV_DIR}/bin/${F}.dll
259 DESTINATION ${FRAMEWORKS_IN_APP_DIR})
260 ENDFOREACH()
261
262 FOREACH(F ${APP_FILES})
263 install(FILES ${BINARY_APP_DIR}/${F}
264 DESTINATION ${JAR_IN_APP_DIR})
265
266 ENDFOREACH()
267ENDIF(WIN32)
268
269IF(APPLE)
270 add_custom_target( ${APP_FILE}.framework
271 COMMAND ${CMAKE_COMMAND} -E make_directory ${FRAMEWORKS_IN_APP_DIR}
272 COMMAND cp -f ${jnilibs} ${FRAMEWORKS_IN_APP_DIR}
273 COMMAND cp -f ${deplibs} ${FRAMEWORKS_IN_APP_DIR}
274 COMMAND ${CMAKE_COMMAND} -E chdir ${FRAMEWORKS_IN_APP_DIR} ./change-lib-path.sh
275 COMMENT "Packaging Frameworks"
276 )
277
278 add_custom_target( ${APP_FILE}.update_ver
279 COMMAND defaults write ${BINARY_APP_DIR}/${APP_FILE}/Contents/Info CFBundleVersion `echo ${SIKULI_VERSION} | awk '{print $$1}'`
280 COMMAND plutil -convert xml1 ${BINARY_APP_DIR}/${APP_FILE}/Contents/Info.plist
281 )
282
283 add_dependencies( ${APP_FILE} ${APP_FILE}.framework ${APP_FILE}.update_ver)
284
285ENDIF(APPLE)
286
287install(DIRECTORY ${BINARY_APP_DIR}/${APP_FILE}
288 USE_SOURCE_PERMISSIONS
289 DESTINATION .
290)
291
292
293add_custom_target( app ALL
294)
295
296
297FOREACH(JAR ${INCLUDE_JARS})
298 get_filename_component(JAR_FILENAME ${JAR} NAME)
299 get_filename_component(target ${JAR} NAME_WE)
300 set(target "include_${target}")
301 add_custom_target( ${target}
302 COMMAND ${CMAKE_COMMAND} -E copy ${JAR} ${JAR_IN_APP_DIR}/${JAR_FILENAME}
303
304 COMMENT "Copying ${JAR_FILENAME}"
305 )
306 add_dependencies( ${APP_FILE} ${target} )
307ENDFOREACH(JAR ${INCLUDE_JARS})
308
309
310get_filename_component(target ${JAR_FILE} NAME_WE)
311add_dependencies( include_${target} ${JAR_FILE})
312add_dependencies( app ${APP_FILE})
313
314## Language files
315
316add_custom_target( update-po
317 COMMAND prop2po ${RESOURCE_DIR}/i18n/IDE_en_US.properties > ${RESOURCE_DIR}/i18n/IDE/IDE.pot
318
319 COMMENT "Update the IDE.pot file"
320)
321
322add_custom_target( update-prop
323 COMMAND ${BASE_DIR}/../utils/update-prop.sh ${RESOURCE_DIR}
324 COMMENT "Update the IDE language properties."
325)
326
327
328## Packaging
329
330if(APPLE)
331 SET(CPACK_GENERATOR DragNDrop )
332 # SET(CPACK_GENERATOR ZIP )
333else(APPLE)
334 SET(CPACK_GENERATOR
335 ZIP
336 )
337endif(APPLE)
338
339SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Sikuli ${SIKULI_VERSION}")
340SET(CPACK_PACKAGE_VENDOR "Sikuli Development Team")
341SET(CPACK_PACKAGE_DESCRIPTION_FILE "${BASE_DIR}/../readme.txt")
342SET(CPACK_RESOURCE_FILE_LICENSE "${BASE_DIR}/../copyright.txt")
343SET(CPACK_PACKAGE_FILE_NAME ${RELEASE_FILE})
344
345INCLUDE(CPack)
346
347install(FILES
348 ${CPACK_PACKAGE_DESCRIPTION_FILE}
349 ${CPACK_RESOURCE_FILE_LICENSE}
350 DESTINATION .
351)
352
353# type "make package" to generate release packages
354
355
356## tests
357
358SET(MAIN_TEST_SUITE ${PACKAGE}.SikuliIDETestSuite)
359
360add_custom_target( java-test.test-res
361 COMMAND ${CMAKE_COMMAND} -E copy_directory ${BASE_DIR}/${TEST_RESOURCE_DIR} ${CMAKE_BINARY_DIR}/${TEST_RESOURCE_DIR}
362 COMMENT "Copy test resource"
363)
364
365add_custom_target( java-test
366 # COMMAND ${JAVA_RUNTIME} -cp ${TEST_CLASS_DIR}${SEP}${BINARY_DIR}/${JAR_FILE}${SEP}${JUNIT_JAR} junit.textui.TestRunner ${MAIN_TEST_SUITE}
367 COMMAND ant -f ${JAVA_TEST_FOR_HUDSON_XML}
368 COMMENT "Run Java unit tests"
369)
370
371add_dependencies( java-test
372 ${JAR_FILE}
373 ${PROJECT_NAME}.test.classes
374 java-test.test-res
375)
376
377add_custom_target( all-test
378)
379
380add_dependencies( all-test
381 java-test
382)
383
384## Dependencies
385
386add_dependencies( ${JAR_FILE}.prepare
387 ${JAR_FILE}.resources
388 ${JAR_FILE}.classes-in-jar
389 # ${JAR_FILE}.libs-in-jar
390)
391
392add_dependencies( ${JAR_FILE} ${JAR_FILE}.prepare )
393add_dependencies( run-user ${JAR_FILE})
394add_dependencies( run ${JAR_FILE})
395add_dependencies( app ${APP_FILE})
396
397
398ADD_SUBDIRECTORY( ${JAVA_SRC_DIR} )
399#ADD_SUBDIRECTORY( ${NATIVE_SRC_DIR} )
400ADD_SUBDIRECTORY( ${JAVA_TEST_DIR} )
401
402
403
404SET(SIKULI_VERSION CACHE INTERNAL "" FORCE)
405
4060
=== removed directory '.pc/jgoodies-1.6-compat.patch/sikuli-ide/src'
=== removed directory '.pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main'
=== removed directory '.pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main/java'
=== removed directory '.pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main/java/org'
=== removed directory '.pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main/java/org/sikuli'
=== removed directory '.pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main/java/org/sikuli/ide'
=== removed file '.pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main/java/org/sikuli/ide/PreferencesWin.java'
--- .pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main/java/org/sikuli/ide/PreferencesWin.java 2012-12-07 22:13:08 +0000
+++ .pc/jgoodies-1.6-compat.patch/sikuli-ide/src/main/java/org/sikuli/ide/PreferencesWin.java 1970-01-01 00:00:00 +0000
@@ -1,561 +0,0 @@
1/*
2 * Copyright 2010-2011, Sikuli.org
3 * Released under the MIT License.
4 *
5 */
6package org.sikuli.ide;
7
8import java.awt.*;
9import java.awt.event.*;
10import java.util.prefs.*;
11import java.util.Arrays;
12import java.util.Comparator;
13import java.util.Locale;
14import java.util.ResourceBundle;
15import java.util.MissingResourceException;
16import javax.swing.DefaultListCellRenderer;
17import javax.swing.JList;
18import javax.swing.BoxLayout;
19import javax.swing.ButtonGroup;
20import javax.swing.JButton;
21import javax.swing.JCheckBox;
22import javax.swing.JComboBox;
23import javax.swing.JFrame;
24import javax.swing.JLabel;
25import javax.swing.JPanel;
26import javax.swing.JRadioButton;
27import javax.swing.JSpinner;
28import javax.swing.JTabbedPane;
29import javax.swing.JTextField;
30import javax.swing.SpinnerNumberModel;
31import javax.swing.SwingConstants;
32import javax.swing.border.EmptyBorder;
33import javax.swing.event.ChangeEvent;
34import javax.swing.event.ChangeListener;
35import com.jgoodies.forms.factories.DefaultComponentFactory;
36import org.jdesktop.layout.*;
37
38import org.sikuli.script.Debug;
39
40/*
41 * Created by JFormDesigner on Mon Nov 16 10:13:52 EST 2009
42 */
43
44
45public class PreferencesWin extends JFrame {
46 UserPreferences pref = UserPreferences.getInstance();
47 int _cap_hkey, _cap_mod;
48 int _old_cap_hkey, _old_cap_mod;
49
50 public PreferencesWin() {
51 super( SikuliIDE._I("winPreferences") );
52 initComponents();
53 loadPrefs();
54 }
55
56 private void loadPrefs(){
57 SikuliIDE ide = SikuliIDE.getInstance();
58 double delay = pref.getCaptureDelay();
59 _spnDelay.setValue(delay);
60 _old_cap_hkey = _cap_hkey = pref.getCaptureHotkey();
61 _old_cap_mod = _cap_mod = pref.getCaptureHotkeyModifiers();
62 setTxtHotkey(_cap_hkey, _cap_mod);
63 switch(pref.getAutoNamingMethod()){
64 case UserPreferences.AUTO_NAMING_TIMESTAMP:
65 _radTimestamp.setSelected(true);
66 break;
67 case UserPreferences.AUTO_NAMING_OCR:
68 _radOCR.setSelected(true);
69 break;
70 case UserPreferences.AUTO_NAMING_OFF:
71 _radOff.setSelected(true);
72 break;
73 default:
74 Debug.error("Error in reading auto naming method preferences");
75 }
76 _chkAutoUpdate.setSelected(pref.getCheckUpdate());
77
78 _chkExpandTab.setSelected(pref.getExpandTab());
79 _spnTabWidth.setValue(pref.getTabWidth());
80 initFontPrefs();
81 initLangPrefs();
82 }
83
84 private void initLangPrefs(){
85 String[] SUPPORT_LOCALES = {
86 "es", "pt_BR", "ar", "fr", "ru", "bg", "he", "sv", "ca", "ja", "tr",
87 "da", "ko", "uk", "de", "nl", "zh_CN", "en_US", "pl", "zh_TW"
88 };
89 Locale[] sortedLocales = new Locale[SUPPORT_LOCALES.length];
90 UserPreferences pref = UserPreferences.getInstance();
91 int count = 0;
92 for (String locale_code: SUPPORT_LOCALES){
93 Locale l;
94 if( locale_code.indexOf("_")>=0 ){
95 String[] lang_country = locale_code.split("_");
96 l = new Locale(lang_country[0], lang_country[1]);
97 }
98 else
99 l = new Locale(locale_code);
100 sortedLocales[count++] = l;
101 }
102 Arrays.sort(sortedLocales, new Comparator<Locale>(){
103 public int compare(Locale l1, Locale l2) {
104 return l1.getDisplayLanguage().compareTo(l2.getDisplayLanguage());
105 }
106 });
107
108 for(Locale l : sortedLocales){
109 _cmbLang.addItem(l);
110 }
111 _cmbLang.setRenderer(new LocaleListCellRenderer());
112 Locale curLocale = pref.getLocale();
113 _cmbLang.setSelectedItem(curLocale);
114 if(!_cmbLang.getSelectedItem().equals(curLocale)){
115 if(curLocale.getVariant().length() > 0){
116 curLocale = new Locale(curLocale.getLanguage(), curLocale.getCountry());
117 _cmbLang.setSelectedItem(curLocale);
118 }
119 if(!_cmbLang.getSelectedItem().equals(curLocale))
120 _cmbLang.setSelectedItem(new Locale(curLocale.getLanguage()));
121 }
122 }
123
124
125 private void initFontPrefs(){
126 UserPreferences pref = UserPreferences.getInstance();
127 String[] fontList = GraphicsEnvironment.getLocalGraphicsEnvironment()
128 .getAvailableFontFamilyNames();
129 for (String font: fontList)
130 _cmbFontName.addItem(font);
131 _cmbFontName.setSelectedItem(pref.getFontName());
132 _spnFontSize.setValue(pref.getFontSize());
133 }
134
135 private void savePrefs(){
136 SikuliIDE ide = SikuliIDE.getInstance();
137 pref.setCaptureDelay((Double)_spnDelay.getValue());
138 pref.setCaptureHotkey(_cap_hkey);
139 pref.setCaptureHotkeyModifiers(_cap_mod);
140 pref.setAutoNamingMethod(
141 _radTimestamp.isSelected()?UserPreferences.AUTO_NAMING_TIMESTAMP:
142 _radOCR.isSelected()?UserPreferences.AUTO_NAMING_OCR:
143 UserPreferences.AUTO_NAMING_OFF);
144 if(_old_cap_hkey != _cap_hkey || _old_cap_mod != _cap_mod){
145 ide.removeCaptureHotkey(_old_cap_hkey, _old_cap_mod);
146 ide.installCaptureHotkey(_cap_hkey, _cap_mod);
147 }
148 pref.setCheckUpdate(_chkAutoUpdate.isSelected());
149
150 pref.setExpandTab(_chkExpandTab.isSelected());
151 pref.setTabWidth((Integer)_spnTabWidth.getValue());
152
153 pref.setFontName( (String)_cmbFontName.getSelectedItem() );
154 pref.setFontSize( (Integer)_spnFontSize.getValue() );
155
156 Locale locale = (Locale)_cmbLang.getSelectedItem();
157 pref.setLocale(locale);
158 I18N.setLocale(locale);
159 }
160
161 private void setTxtHotkey(int code, int mod){
162 _cap_hkey = code;
163 _cap_mod = mod;
164 _txtHotkey.setText( Utils.convertKeyToText(code, mod) );
165 }
166
167 private void btnOkActionPerformed(ActionEvent e) {
168 savePrefs();
169 this.dispose();
170 }
171
172 private void btnCancelActionPerformed(ActionEvent e) {
173 this.dispose();
174 }
175
176 private void txtHotkeyFocusGained(FocusEvent e) {
177 _txtHotkey.setEditable(true);
178 }
179
180 private void txtHotkeyKeyPressed(KeyEvent e) {
181 int code = e.getKeyCode();
182 int mod = e.getModifiers();
183 Debug.log(7, "" + code + " " + mod);
184 setTxtHotkey(code, mod);
185 _txtHotkey.setEditable(false);
186 }
187
188 private void updateFontPreview(){
189 SikuliIDE ide = SikuliIDE.getInstance();
190 Font font = new Font((String)_cmbFontName.getSelectedItem(), Font.PLAIN,
191 (Integer)_spnFontSize.getValue());
192 ide.getCurrentCodePane().setFont(font);
193 }
194
195 private void fontNameItemStateChanged(ItemEvent e) {
196 updateFontPreview();
197 }
198
199 private void fontSizeStateChanged(ChangeEvent e) {
200 updateFontPreview();
201 }
202
203 private void initComponents() {
204 // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
205 DefaultComponentFactory compFactory = DefaultComponentFactory.getInstance();
206 _tabPane = new JTabbedPane();
207 JPanel paneCapture = new JPanel();
208 _txtHotkey = new JTextField();
209 _lblHotkey = new JLabel();
210 _lblDelay = new JLabel();
211 _spnDelay = new JSpinner();
212 _lblDelaySecs = new JLabel();
213 _lblNaming = new JLabel();
214 _radTimestamp = new JRadioButton();
215 _radOCR = new JRadioButton();
216 _radOff = new JRadioButton();
217 _paneTextEditing = new JPanel();
218 _chkExpandTab = new JCheckBox();
219 _lblTabWidth = new JLabel();
220 _cmbFontName = new JComboBox();
221 _lblFont = new JLabel();
222 _titleAppearance = compFactory.createTitle("");
223 _titleIndentation = compFactory.createTitle("");
224 _spnTabWidth = new JSpinner();
225 _lblFontSize = new JLabel();
226 _spnFontSize = new JSpinner();
227 JPanel paneGeneral = new JPanel();
228 _chkAutoUpdate = new JCheckBox();
229 _cmbLang = new JComboBox();
230 _lblUpdates = new JLabel();
231 _lblLanguage = new JLabel();
232 JPanel paneOkCancel = new JPanel();
233 JPanel hSpacer1 = new JPanel(null);
234 _btnOk = new JButton();
235 _btnCancel = new JButton();
236
237 //======== this ========
238 Container contentPane = getContentPane();
239 contentPane.setLayout(new BorderLayout());
240
241 //======== _tabPane ========
242 {
243 _tabPane.setBorder(new EmptyBorder(10, 10, 0, 10));
244
245 //======== paneCapture ========
246 {
247
248 //---- _txtHotkey ----
249 _txtHotkey.setHorizontalAlignment(SwingConstants.RIGHT);
250 _txtHotkey.addFocusListener(new FocusAdapter() {
251 @Override
252 public void focusGained(FocusEvent e) {
253 txtHotkeyFocusGained(e);
254 }
255 });
256 _txtHotkey.addKeyListener(new KeyAdapter() {
257 @Override
258 public void keyPressed(KeyEvent e) {
259 txtHotkeyKeyPressed(e);
260 }
261 });
262
263 //---- _lblHotkey ----
264 _lblHotkey.setLabelFor(_txtHotkey);
265
266 //---- _lblDelay ----
267 _lblDelay.setLabelFor(_spnDelay);
268
269 //---- _spnDelay ----
270 _spnDelay.setModel(new SpinnerNumberModel(1.0, 0.0, null, 0.1));
271
272 //---- _radTimestamp ----
273 _radTimestamp.setSelected(true);
274
275 GroupLayout paneCaptureLayout = new GroupLayout(paneCapture);
276 paneCapture.setLayout(paneCaptureLayout);
277 paneCaptureLayout.setHorizontalGroup(
278 paneCaptureLayout.createParallelGroup()
279 .add(paneCaptureLayout.createSequentialGroup()
280 .add(26, 26, 26)
281 .add(paneCaptureLayout.createParallelGroup()
282 .add(GroupLayout.TRAILING, _lblDelay)
283 .add(GroupLayout.TRAILING, _lblHotkey)
284 .add(GroupLayout.TRAILING, _lblNaming))
285 .addPreferredGap(LayoutStyle.RELATED)
286 .add(paneCaptureLayout.createParallelGroup()
287 .add(_radTimestamp)
288 .add(_radOCR)
289 .add(_radOff)
290 .add(paneCaptureLayout.createSequentialGroup()
291 .add(_spnDelay, GroupLayout.DEFAULT_SIZE, 148, Short.MAX_VALUE)
292 .addPreferredGap(LayoutStyle.RELATED)
293 .add(_lblDelaySecs, GroupLayout.DEFAULT_SIZE, 161, Short.MAX_VALUE))
294 .add(_txtHotkey, GroupLayout.DEFAULT_SIZE, 315, Short.MAX_VALUE))
295 .add(69, 69, 69))
296 );
297 paneCaptureLayout.setVerticalGroup(
298 paneCaptureLayout.createParallelGroup()
299 .add(paneCaptureLayout.createSequentialGroup()
300 .add(34, 34, 34)
301 .add(paneCaptureLayout.createParallelGroup(GroupLayout.BASELINE)
302 .add(_lblHotkey, GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
303 .add(_txtHotkey, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
304 .addPreferredGap(LayoutStyle.RELATED)
305 .add(paneCaptureLayout.createParallelGroup()
306 .add(_lblDelay, GroupLayout.PREFERRED_SIZE, 28, GroupLayout.PREFERRED_SIZE)
307 .add(_spnDelay, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
308 .add(_lblDelaySecs, GroupLayout.PREFERRED_SIZE, 28, GroupLayout.PREFERRED_SIZE))
309 .addPreferredGap(LayoutStyle.RELATED)
310 .add(paneCaptureLayout.createParallelGroup(GroupLayout.LEADING, false)
311 .add(paneCaptureLayout.createSequentialGroup()
312 .add(paneCaptureLayout.createParallelGroup(GroupLayout.BASELINE)
313 .add(_lblNaming, GroupLayout.PREFERRED_SIZE, 22, GroupLayout.PREFERRED_SIZE)
314 .add(_radTimestamp))
315 .add(18, 18, 18)
316 .add(_radOff)
317 .addPreferredGap(LayoutStyle.RELATED))
318 .add(GroupLayout.TRAILING, paneCaptureLayout.createSequentialGroup()
319 .add(_radOCR)
320 .add(21, 21, 21)))
321 .add(80, 80, 80))
322 );
323 }
324 _tabPane.addTab(I18N._I("prefTabScreenCapturing"), paneCapture);
325
326
327 //======== _paneTextEditing ========
328 {
329
330 //---- _lblTabWidth ----
331 _lblTabWidth.setLabelFor(_spnTabWidth);
332
333 //---- _cmbFontName ----
334 _cmbFontName.addItemListener(new ItemListener() {
335 public void itemStateChanged(ItemEvent e) {
336 fontNameItemStateChanged(e);
337 }
338 });
339
340 //---- _lblFont ----
341 _lblFont.setLabelFor(_cmbFontName);
342
343 //---- _lblFontSize ----
344 _lblFontSize.setLabelFor(_cmbFontName);
345
346 //---- _spnFontSize ----
347 _spnFontSize.addChangeListener(new ChangeListener() {
348 public void stateChanged(ChangeEvent e) {
349 fontSizeStateChanged(e);
350 }
351 });
352
353 GroupLayout _paneTextEditingLayout = new GroupLayout(_paneTextEditing);
354 _paneTextEditing.setLayout(_paneTextEditingLayout);
355 _paneTextEditingLayout.setHorizontalGroup(
356 _paneTextEditingLayout.createParallelGroup()
357 .add(GroupLayout.TRAILING, _paneTextEditingLayout.createSequentialGroup()
358 .add(95, 95, 95)
359 .add(_paneTextEditingLayout.createParallelGroup()
360 .add(_titleIndentation, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
361 .add(_paneTextEditingLayout.createSequentialGroup()
362 .add(_titleAppearance, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
363 .addPreferredGap(LayoutStyle.RELATED)
364 .add(_paneTextEditingLayout.createParallelGroup()
365 .add(_paneTextEditingLayout.createSequentialGroup()
366 .add(29, 29, 29)
367 .add(_paneTextEditingLayout.createParallelGroup()
368 .add(GroupLayout.TRAILING, _lblTabWidth)
369 .add(GroupLayout.TRAILING, _lblFont)
370 .add(GroupLayout.TRAILING, _lblFontSize))
371 .addPreferredGap(LayoutStyle.RELATED)
372 .add(_paneTextEditingLayout.createParallelGroup()
373 .add(_cmbFontName, 0, 218, Short.MAX_VALUE)
374 .add(_spnFontSize, GroupLayout.PREFERRED_SIZE, 67, GroupLayout.PREFERRED_SIZE)
375 .add(_spnTabWidth, GroupLayout.PREFERRED_SIZE, 52, GroupLayout.PREFERRED_SIZE))
376 .addPreferredGap(LayoutStyle.RELATED, 97, Short.MAX_VALUE))
377 .add(_chkExpandTab, GroupLayout.DEFAULT_SIZE, 420, Short.MAX_VALUE))))
378 .addContainerGap())
379 );
380 _paneTextEditingLayout.setVerticalGroup(
381 _paneTextEditingLayout.createParallelGroup()
382 .add(_paneTextEditingLayout.createSequentialGroup()
383 .add(21, 21, 21)
384 .add(_titleIndentation, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
385 .add(_paneTextEditingLayout.createParallelGroup()
386 .add(_paneTextEditingLayout.createSequentialGroup()
387 .add(81, 81, 81)
388 .add(_titleAppearance, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
389 .add(_paneTextEditingLayout.createSequentialGroup()
390 .addPreferredGap(LayoutStyle.RELATED)
391 .add(_chkExpandTab)
392 .addPreferredGap(LayoutStyle.RELATED)
393 .add(_paneTextEditingLayout.createParallelGroup()
394 .add(_lblTabWidth, GroupLayout.PREFERRED_SIZE, 16, GroupLayout.PREFERRED_SIZE)
395 .add(_spnTabWidth, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
396 .add(40, 40, 40)
397 .add(_paneTextEditingLayout.createParallelGroup(GroupLayout.BASELINE)
398 .add(_lblFont)
399 .add(_cmbFontName, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
400 .addPreferredGap(LayoutStyle.RELATED)
401 .add(_paneTextEditingLayout.createParallelGroup(GroupLayout.TRAILING)
402 .add(_lblFontSize, GroupLayout.PREFERRED_SIZE, 27, GroupLayout.PREFERRED_SIZE)
403 .add(_spnFontSize, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))))
404 .addContainerGap(154, Short.MAX_VALUE))
405 );
406 _paneTextEditingLayout.linkSize(new Component[] {_lblTabWidth, _spnTabWidth}, GroupLayout.VERTICAL);
407 _paneTextEditingLayout.linkSize(new Component[] {_cmbFontName, _lblFont}, GroupLayout.VERTICAL);
408 }
409 _tabPane.addTab(I18N._I("PreferencesWin.paneTextEditing.tab.title"), _paneTextEditing);
410
411
412 //======== paneGeneral ========
413 {
414
415 //---- _lblUpdates ----
416 _lblUpdates.setFont(_lblUpdates.getFont().deriveFont(_lblUpdates.getFont().getStyle() | Font.BOLD));
417
418 //---- _lblLanguage ----
419 _lblLanguage.setFont(_lblLanguage.getFont().deriveFont(_lblLanguage.getFont().getStyle() | Font.BOLD));
420
421 GroupLayout paneGeneralLayout = new GroupLayout(paneGeneral);
422 paneGeneral.setLayout(paneGeneralLayout);
423 paneGeneralLayout.setHorizontalGroup(
424 paneGeneralLayout.createParallelGroup()
425 .add(paneGeneralLayout.createSequentialGroup()
426 .add(137, 137, 137)
427 .add(paneGeneralLayout.createParallelGroup()
428 .add(paneGeneralLayout.createSequentialGroup()
429 .add(_lblLanguage)
430 .add(185, 185, 185))
431 .add(paneGeneralLayout.createSequentialGroup()
432 .add(38, 38, 38)
433 .add(_cmbLang, GroupLayout.PREFERRED_SIZE, 215, GroupLayout.PREFERRED_SIZE))
434 .add(paneGeneralLayout.createSequentialGroup()
435 .add(_lblUpdates)
436 .add(318, 318, 318))
437 .add(GroupLayout.TRAILING, paneGeneralLayout.createSequentialGroup()
438 .add(38, 38, 38)
439 .add(_chkAutoUpdate, GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)))
440 .addContainerGap())
441 );
442 paneGeneralLayout.setVerticalGroup(
443 paneGeneralLayout.createParallelGroup()
444 .add(paneGeneralLayout.createSequentialGroup()
445 .add(26, 26, 26)
446 .add(_lblUpdates)
447 .addPreferredGap(LayoutStyle.RELATED)
448 .add(_chkAutoUpdate)
449 .add(40, 40, 40)
450 .add(_lblLanguage)
451 .addPreferredGap(LayoutStyle.RELATED)
452 .add(_cmbLang, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
453 .addContainerGap(196, Short.MAX_VALUE))
454 );
455 }
456 _tabPane.addTab(I18N._I("prefTabGeneralSettings"), paneGeneral);
457
458 }
459 contentPane.add(_tabPane, BorderLayout.CENTER);
460
461 //======== paneOkCancel ========
462 {
463 paneOkCancel.setBorder(new EmptyBorder(5, 5, 5, 5));
464 paneOkCancel.setLayout(new BoxLayout(paneOkCancel, BoxLayout.X_AXIS));
465 paneOkCancel.add(hSpacer1);
466
467 //---- _btnOk ----
468 _btnOk.addActionListener(new ActionListener() {
469 public void actionPerformed(ActionEvent e) {
470 btnOkActionPerformed(e);
471 }
472 });
473 paneOkCancel.add(_btnOk);
474
475 //---- _btnCancel ----
476 _btnCancel.addActionListener(new ActionListener() {
477 public void actionPerformed(ActionEvent e) {
478 btnCancelActionPerformed(e);
479 }
480 });
481 paneOkCancel.add(_btnCancel);
482 }
483 contentPane.add(paneOkCancel, BorderLayout.SOUTH);
484 setSize(600, 475);
485 setLocationRelativeTo(getOwner());
486
487 //---- btngrpNaming ----
488 ButtonGroup btngrpNaming = new ButtonGroup();
489 btngrpNaming.add(_radTimestamp);
490 btngrpNaming.add(_radOCR);
491 btngrpNaming.add(_radOff);
492
493 initComponentsI18n();
494 // JFormDesigner - End of component initialization //GEN-END:initComponents
495 }
496
497 private void initComponentsI18n() {
498 // JFormDesigner - Component i18n initialization - DO NOT MODIFY //GEN-BEGIN:initI18n
499 DefaultComponentFactory.setTextAndMnemonic(_titleAppearance, I18N._I("PreferencesWin.titleAppearance.textWithMnemonic"));
500 DefaultComponentFactory.setTextAndMnemonic(_titleIndentation, I18N._I("PreferencesWin.titleIndentation.textWithMnemonic"));
501 _lblHotkey.setText(I18N._I("prefCaptureHotkey"));
502 _lblDelay.setText(I18N._I("prefCaptureDelay"));
503 _lblDelaySecs.setText(I18N._I("prefSeconds"));
504 _lblNaming.setText(I18N._I("prefAutoNaming"));
505 _radTimestamp.setText(I18N._I("prefTimestamp"));
506 _radOCR.setText(I18N._I("prefRecognizedText"));
507 _radOff.setText(I18N._I("prefManualInput"));
508 _tabPane.setTitleAt(0, I18N._I("prefTabScreenCapturing"));
509 _chkExpandTab.setText(I18N._I("PreferencesWin.chkExpandTab.text"));
510 _lblTabWidth.setText(I18N._I("PreferencesWin.lblTabWidth.text"));
511 _lblFont.setText(I18N._I("PreferencesWin.lblFont.text"));
512 _lblFontSize.setText(I18N._I("PreferencesWin.lblFontSize.text"));
513 _tabPane.setTitleAt(1, I18N._I("PreferencesWin.paneTextEditing.tab.title"));
514 _chkAutoUpdate.setText(I18N._I("prefGeneralAutoCheck"));
515 _lblUpdates.setText(I18N._I("PreferencesWin.lblUpdates.text"));
516 _lblLanguage.setText(I18N._I("PreferencesWin.lblLanguage.text"));
517 _tabPane.setTitleAt(2, I18N._I("prefTabGeneralSettings"));
518 _btnOk.setText(I18N._I("ok"));
519 _btnCancel.setText(I18N._I("cancel"));
520 // JFormDesigner - End of component i18n initialization //GEN-END:initI18n
521 }
522
523 // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
524 private JTabbedPane _tabPane;
525 private JTextField _txtHotkey;
526 private JLabel _lblHotkey;
527 private JLabel _lblDelay;
528 private JSpinner _spnDelay;
529 private JLabel _lblDelaySecs;
530 private JLabel _lblNaming;
531 private JRadioButton _radTimestamp;
532 private JRadioButton _radOCR;
533 private JRadioButton _radOff;
534 private JPanel _paneTextEditing;
535 private JCheckBox _chkExpandTab;
536 private JLabel _lblTabWidth;
537 private JComboBox _cmbFontName;
538 private JLabel _lblFont;
539 private JLabel _titleAppearance;
540 private JLabel _titleIndentation;
541 private JSpinner _spnTabWidth;
542 private JLabel _lblFontSize;
543 private JSpinner _spnFontSize;
544 private JCheckBox _chkAutoUpdate;
545 private JComboBox _cmbLang;
546 private JLabel _lblUpdates;
547 private JLabel _lblLanguage;
548 private JButton _btnOk;
549 private JButton _btnCancel;
550 // JFormDesigner - End of variables declaration //GEN-END:variables
551}
552
553class LocaleListCellRenderer extends DefaultListCellRenderer {
554 public Component getListCellRendererComponent(JList list,
555 Object value, int index, boolean isSelected, boolean hasFocus) {
556 Locale locale = (Locale) (value);
557 return super.getListCellRendererComponent(list,
558 locale.getDisplayName(locale), index, isSelected, hasFocus);
559 }
560}
561
5620
=== removed directory '.pc/native.patch'
=== removed directory '.pc/native.patch/sikuli-script'
=== removed directory '.pc/native.patch/sikuli-script/src'
=== removed directory '.pc/native.patch/sikuli-script/src/main'
=== removed directory '.pc/native.patch/sikuli-script/src/main/java'
=== removed directory '.pc/native.patch/sikuli-script/src/main/java/org'
=== removed directory '.pc/native.patch/sikuli-script/src/main/java/org/sikuli'
=== removed directory '.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script'
=== removed file '.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/Finder.java'
--- .pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/Finder.java 2012-02-15 15:17:58 +0000
+++ .pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/Finder.java 1970-01-01 00:00:00 +0000
@@ -1,195 +0,0 @@
1/*
2 * Copyright 2010-2011, Sikuli.org
3 * Released under the MIT License.
4 *
5 */
6package org.sikuli.script;
7
8import java.awt.*;
9import java.util.Iterator;
10import java.io.File;
11import java.io.IOException;
12import java.io.FileNotFoundException;
13
14import org.sikuli.script.natives.FindInput;
15import org.sikuli.script.natives.FindResult;
16import org.sikuli.script.natives.FindResults;
17import org.sikuli.script.natives.Mat;
18import org.sikuli.script.natives.TARGET_TYPE;
19import org.sikuli.script.natives.Vision;
20
21import com.wapmx.nativeutils.jniloader.NativeLoader;
22
23public class Finder implements Iterator<Match>{
24 private Region _region = null;
25 private Pattern _pattern = null;
26 private FindInput _findInput = new FindInput();
27 private FindResults _results = null;
28 private ImageLocator _imgLocator = null;
29 private int _cur_result_i;
30
31 static {
32 try{
33 NativeLoader.loadLibrary("VisionProxy");
34 Debug.info("Sikuli vision engine loaded.");
35 }
36 catch(IOException e){
37 e.printStackTrace();
38 }
39 //Vision.setParameter("GPU", 1);
40 }
41
42 public Finder __enter__(){
43 return this;
44 }
45
46 public void __exit__(Object type, Object value, Object trackback){
47 destroy();
48 }
49
50 /**
51 * Finder constructor (finding within the desktop screen).
52 */
53 public Finder(String screenFilename) throws IOException{
54 this(screenFilename, null);
55 }
56
57 /**
58 * Finder constructor (finding within the given region).
59 */
60 public Finder(String screenFilename, Region region) throws IOException{
61 String fname = findImageFile(screenFilename);
62 _findInput.setSource(fname);
63 _region = region;
64 }
65
66 /**
67 * Finder constructor (finding within the given region).
68 */
69 public Finder(ScreenImage img, Region region){
70 Mat target = OpenCV.convertBufferedImageToMat(img.getImage());
71 _findInput.setSource(target);
72 _region = region;
73 }
74
75 public void __del__(){
76 destroy();
77 }
78
79 protected void finalize() throws Throwable {
80 destroy();
81 }
82
83 protected String findImageFile(String file) throws IOException{
84 if(_imgLocator == null)
85 _imgLocator = new ImageLocator();
86 return _imgLocator.locate(file);
87 }
88
89 protected <PSC> void setFindInput(PSC ptn) throws IOException{
90 if( ptn instanceof Pattern ){
91 _pattern = (Pattern)ptn;
92 Mat targetMat = OpenCV.convertBufferedImageToMat(_pattern.getImage());
93 _findInput.setTarget(targetMat);
94 _findInput.setSimilarity(_pattern.similarity);
95 }
96 else if( ptn instanceof String){
97 setTargetSmartly(_findInput, (String)ptn);
98 _findInput.setSimilarity(Settings.MinSimilarity);
99 }
100 }
101
102 protected void setTargetSmartly(FindInput fin, String target){
103 try{
104 //assume it's a file first
105 String filename = findImageFile(target);
106 fin.setTarget(TARGET_TYPE.IMAGE, filename);
107 }
108 catch(IOException e){
109 if(Util.isImageFile(target))
110 Debug.error(target + " looks like a file, but can't be found on the disk. Assume it's text." );
111 // this will init text recognizer on demand
112 TextRecognizer tr = TextRecognizer.getInstance();
113 //assume it's text
114 fin.setTarget(TARGET_TYPE.TEXT, target);
115 }
116 }
117
118
119
120 /**
121 * void find( Pattern/String/PatternClass )
122 * finds the given pattern in the given ScreenImage.
123 */
124 public <PSC> void find(PSC ptn) throws IOException{
125 setFindInput(ptn);
126 _results = Vision.find(_findInput);
127 _cur_result_i = 0;
128 }
129
130 public void find(String templateFilename, double minSimilarity) throws IOException{
131 setTargetSmartly(_findInput, templateFilename);
132 _findInput.setSimilarity(minSimilarity);
133 _results = Vision.find(_findInput);
134 _cur_result_i = 0;
135 }
136
137 public <PSC> void findAll(PSC ptn) throws IOException {
138 Debug timing = new Debug();
139 timing.startTiming("Finder.findAll");
140
141 setFindInput(ptn);
142 _findInput.setFindAll(true);
143 _results = Vision.find(_findInput);
144 _cur_result_i = 0;
145
146 timing.endTiming("Finder.findAll");
147 }
148
149 public void findAll(String templateFilename, double minSimilarity) throws IOException {
150 Debug timing = new Debug();
151 timing.startTiming("Finder.findAll");
152
153 setTargetSmartly(_findInput, templateFilename);
154 _findInput.setSimilarity(minSimilarity);
155 _findInput.setFindAll(true);
156 _results = Vision.find(_findInput);
157 _cur_result_i = 0;
158
159 timing.endTiming("Finder.findAll");
160 }
161
162 public boolean hasNext(){
163 if(_results != null && _results.size() > _cur_result_i)
164 return true;
165 return false;
166 }
167
168
169 public Match next(){
170 Match ret = null;
171 if(hasNext()){
172 FindResult fr = _results.get(_cur_result_i++);
173 IScreen parentScreen = null;
174 if(_region != null)
175 parentScreen = _region.getScreen();
176 ret = new Match(fr, parentScreen);
177 if(_region != null){
178 ret = _region.toGlobalCoord(ret);
179 }
180 if(_pattern != null){
181 Location offset = _pattern.getTargetOffset();
182 ret.setTargetOffset(offset);
183 }
184 }
185 return ret;
186 }
187
188 public void remove(){
189 }
190
191 public void destroy(){
192 }
193
194}
195
1960
=== removed file '.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/TextRecognizer.java'
--- .pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/TextRecognizer.java 2012-02-15 15:17:58 +0000
+++ .pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/TextRecognizer.java 1970-01-01 00:00:00 +0000
@@ -1,120 +0,0 @@
1/*
2 * Copyright 2010-2011, Sikuli.org
3 * Released under the MIT License.
4 *
5 */
6package org.sikuli.script;
7
8import java.awt.image.*;
9import java.io.*;
10import java.net.URL;
11import java.util.Enumeration;
12import java.util.List;
13import java.util.LinkedList;
14
15import org.sikuli.script.natives.Mat;
16import org.sikuli.script.natives.Vision;
17import org.sikuli.script.natives.OCRWord;
18import org.sikuli.script.natives.OCRWords;
19
20import com.wapmx.nativeutils.jniloader.NativeLoader;
21
22// Singleton
23public class TextRecognizer {
24 protected static TextRecognizer _instance = null;
25
26 static {
27 try{
28 NativeLoader.loadLibrary("VisionProxy");
29 TextRecognizer tr = TextRecognizer.getInstance();
30 }
31 catch(IOException e){
32 e.printStackTrace();
33 }
34 }
35
36 protected TextRecognizer(){
37 init();
38 }
39
40 boolean _init_succeeded = false;
41
42 public void init(){
43 Debug.info("Text Recognizer inited.");
44 try{
45 String path = ResourceExtractor.extract("tessdata");
46 // TESSDATA_PREFIX doesn't contain tessdata/
47 if(path.endsWith("tessdata/"))
48 path = path.substring(0,path.length()-9);
49 Settings.OcrDataPath = path;
50 Debug.log(3, "OCR data path: " + path);
51
52 Vision.initOCR(Settings.OcrDataPath);
53 _init_succeeded = true;
54 }
55 catch(IOException e){
56 e.printStackTrace();
57 }catch(Exception e){
58 e.printStackTrace();
59 }
60 }
61
62 public static TextRecognizer getInstance(){
63 if(_instance==null)
64 _instance = new TextRecognizer();
65 return _instance;
66 }
67
68 public enum ListTextMode {
69 WORD, LINE, PARAGRAPH
70 };
71
72 public List<Match> listText(ScreenImage simg, Region parent){
73 return listText(simg, parent, ListTextMode.WORD);
74 }
75
76 //TODO: support LINE and PARAGRAPH
77 // listText only supports WORD mode now.
78 public List<Match> listText(ScreenImage simg, Region parent, ListTextMode mode){
79 Mat mat = OpenCV.convertBufferedImageToMat(simg.getImage());
80 OCRWords words = Vision.recognize_as_ocrtext(mat).getWords();
81 List<Match> ret = new LinkedList<Match>();
82 for(int i=0;i<words.size();i++){
83 OCRWord w = words.get(i);
84 Match m = new Match(parent.x+w.getX(), parent.y+w.getY(), w.getWidth(), w.getHeight(),
85 w.getScore(), parent.getScreen(), w.getString());
86 ret.add(m);
87 }
88 return ret;
89 }
90
91
92 public String recognize(ScreenImage simg){
93 BufferedImage img = simg.getImage();
94 return recognize(img);
95 }
96
97 public String recognize(BufferedImage img){
98 if (_init_succeeded){
99 Mat mat = OpenCV.convertBufferedImageToMat(img);
100 return Vision.recognize(mat).trim();
101 }else{
102 return "";
103 }
104 }
105
106 public String recognizeWord(ScreenImage simg){
107 BufferedImage img = simg.getImage();
108 return recognizeWord(img);
109 }
110
111 public String recognizeWord(BufferedImage img){
112 if (_init_succeeded){
113 Mat mat = OpenCV.convertBufferedImageToMat(img);
114 return Vision.recognizeWord(mat).trim();
115 }else{
116 return "";
117 }
118 }
119}
120
1210
=== removed file '.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/VDictProxy.java'
--- .pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/VDictProxy.java 2011-10-04 00:57:09 +0000
+++ .pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/VDictProxy.java 1970-01-01 00:00:00 +0000
@@ -1,118 +0,0 @@
1/*
2 * Copyright 2010-2011, Sikuli.org
3 * Released under the MIT License.
4 *
5 */
6package org.sikuli.script;
7
8import java.io.File;
9import java.io.IOException;
10import java.io.FileNotFoundException;
11import java.util.Vector;
12import java.util.HashMap;
13import java.util.Map;
14import java.util.List;
15import com.wapmx.nativeutils.jniloader.NativeLoader;
16
17public class VDictProxy<T> {
18 private long _instance;
19 private Map<Integer, T> _i2obj = new HashMap<Integer, T>();
20
21 static {
22 // load libScreenMatchProxy.{so,jnilib}
23 //System.loadLibrary("ScreenMatchProxy");
24 try{
25 NativeLoader.loadLibrary("VDictProxy");
26 Debug.info("VDictProxy loaded.");
27 }
28 catch(IOException e){
29 e.printStackTrace();
30 }
31 }
32
33 public VDictProxy(){
34 _instance = getInstance();
35 }
36
37 private native long getInstance();
38
39 private String getAbsolutePath(String filename) throws FileNotFoundException{
40 if(new File(filename).exists())
41 return filename;
42 filename = Settings.BundlePath + File.separator + filename;
43 if(new File(filename).exists())
44 return filename;
45 throw new FileNotFoundException("No such file: " + filename);
46 }
47
48 // insert an (key,value) entry using an image key
49 public void insert(String imagekey_filename, T value) throws FileNotFoundException {
50 imagekey_filename = getAbsolutePath(imagekey_filename);
51 int hash = value.hashCode();
52 while(true){
53 if( hash != -1 && !_i2obj.containsKey(hash) ){
54 _i2obj.put(hash, value);
55 break;
56 }
57 else{
58 hash += (int)(Math.random()*100);
59 }
60 }
61 _insert(_instance, imagekey_filename, hash);
62 }
63
64 public native void _insert(long instance, String imagekey_filename, int value);
65
66 // lookup the entry using an image key (exact match)
67 public T lookup(String imagekey_filename) throws FileNotFoundException{
68 imagekey_filename = getAbsolutePath(imagekey_filename);
69 int hash = _lookup(_instance, imagekey_filename);
70 if(hash==-1) return null;
71 return _i2obj.get(hash);
72 }
73
74 private native int _lookup(long instance, String imagekey_filename);
75
76 // lookup the first entry with a similar image key
77 public T lookup_similar(String imagekey_filename, double similarity_threshold) throws FileNotFoundException{
78 imagekey_filename = getAbsolutePath(imagekey_filename);
79 int hash = _lookup_similar(_instance, imagekey_filename, similarity_threshold);
80 if(hash==-1) return null;
81 return _i2obj.get(hash);
82 }
83
84 private native int _lookup_similar(long instance, String imagekey_filename, double similarity_threshold);
85
86 // lookup at most n entries with keys similar to the given image (n = 0 : all)
87 public List<T> lookup_similar_n(String imagekey_filename, double similarity_threshold, int n) throws FileNotFoundException{
88 imagekey_filename = getAbsolutePath(imagekey_filename);
89 int h[] = _lookup_similar_n(_instance, imagekey_filename, similarity_threshold, n);
90 List<T> ret = new Vector<T>(h.length);
91 for(int i=0;i<h.length;i++){
92 if(h[i] == -1)
93 ret.add(i, null);
94 else
95 ret.add(i, _i2obj.get(h[i]));
96 }
97 return ret;
98 }
99
100 private native int[] _lookup_similar_n(long instance, String imagekey_filename, double similarity_threshold, int n);
101
102 // erase the entry associated with the image
103 public void erase(String imagekey_filename) throws FileNotFoundException{
104 imagekey_filename = getAbsolutePath(imagekey_filename);
105 int h = _lookup(_instance, imagekey_filename);
106 if(h!=-1) _i2obj.remove(h);
107 _erase(_instance, imagekey_filename);
108 }
109
110 private native void _erase(long _instance, String imagekey_filename);
111
112 public int size(){ return _size(_instance); }
113 private native int _size(long instance); // return the number of image keys stored
114
115 public boolean empty(){ return _empty(_instance); }
116 private native boolean _empty(long instance); // test whether it is empty
117}
118
1190
=== removed directory '.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/internal'
=== removed directory '.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/internal/hotkey'
=== removed file '.pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/internal/hotkey/LinuxHotkeyManager.java'
--- .pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/internal/hotkey/LinuxHotkeyManager.java 2011-10-04 00:57:09 +0000
+++ .pc/native.patch/sikuli-script/src/main/java/org/sikuli/script/internal/hotkey/LinuxHotkeyManager.java 1970-01-01 00:00:00 +0000
@@ -1,106 +0,0 @@
1/*
2 * Copyright 2010-2011, Sikuli.org
3 * Released under the MIT License.
4 *
5 */
6package org.sikuli.script.internal.hotkey;
7
8import java.lang.reflect.*;
9import java.awt.Event;
10import java.awt.event.*;
11import java.util.*;
12import java.io.IOException;
13
14import org.sikuli.script.Debug;
15import org.sikuli.script.HotkeyListener;
16import org.sikuli.script.HotkeyEvent;
17
18import com.wapmx.nativeutils.jniloader.NativeLoader;
19import jxgrabkey.HotkeyConflictException;
20import jxgrabkey.JXGrabKey;
21
22public class LinuxHotkeyManager extends HotkeyManager {
23 static{
24 try{
25 NativeLoader.loadLibrary("JXGrabKey");
26 }
27 catch(IOException e){
28 Debug.error("Can't load native lib JXGrabKey");
29 e.printStackTrace();
30 }
31 }
32
33 class HotkeyData {
34 int key, modifiers;
35 HotkeyListener listener;
36
37 public HotkeyData(int key_, int mod_, HotkeyListener l_){
38 key = key_;
39 modifiers = mod_;
40 listener = l_;
41 }
42 };
43
44 class MyHotkeyHandler implements jxgrabkey.HotkeyListener{
45 public void onHotkey(int id){
46 Debug.log(4, "Hotkey pressed");
47 HotkeyData data = _idCallbackMap.get(id);
48 HotkeyEvent e = new HotkeyEvent(data.key, data.modifiers);
49 data.listener.invokeHotkeyPressed(e);
50 }
51 };
52
53 private Map<Integer, HotkeyData> _idCallbackMap = new HashMap<Integer,HotkeyData >();
54 private int _gHotkeyId = 1;
55
56 public boolean _addHotkey(int keyCode, int modifiers, HotkeyListener listener){
57 JXGrabKey grabKey = JXGrabKey.getInstance();
58
59 if(_gHotkeyId == 1){
60 grabKey.addHotkeyListener(new MyHotkeyHandler());
61 }
62
63 _removeHotkey(keyCode, modifiers);
64 int id = _gHotkeyId++;
65 HotkeyData data = new HotkeyData(keyCode, modifiers, listener);
66 _idCallbackMap.put(id, data);
67
68 try{
69 //JXGrabKey.setDebugOutput(true);
70 grabKey.registerAwtHotkey(id, modifiers, keyCode);
71 }catch(HotkeyConflictException e){
72 Debug.error("Hot key conflicts");
73 return false;
74 }
75 return true;
76 }
77
78 public boolean _removeHotkey(int keyCode, int modifiers){
79 for( Map.Entry<Integer, HotkeyData> entry : _idCallbackMap.entrySet() ){
80 HotkeyData data = entry.getValue();
81 if(data.key == keyCode && data.modifiers == modifiers){
82 JXGrabKey grabKey = JXGrabKey.getInstance();
83 int id = entry.getKey();
84 grabKey.unregisterHotKey(id);
85 _idCallbackMap.remove(id);
86 return true;
87 }
88 }
89 return false;
90 }
91
92
93 public void cleanUp(){
94 JXGrabKey grabKey = JXGrabKey.getInstance();
95 for( Map.Entry<Integer, HotkeyData> entry : _idCallbackMap.entrySet() ){
96 int id = entry.getKey();
97 grabKey.unregisterHotKey(id);
98 }
99 _gHotkeyId = 1;
100 _idCallbackMap.clear();
101 grabKey.getInstance().cleanUp();
102 }
103
104}
105
106
1070
=== removed directory '.pc/native.patch/sikuli-script/src/main/native'
=== removed file '.pc/native.patch/sikuli-script/src/main/native/vision.i'
--- .pc/native.patch/sikuli-script/src/main/native/vision.i 2012-02-15 15:17:58 +0000
+++ .pc/native.patch/sikuli-script/src/main/native/vision.i 1970-01-01 00:00:00 +0000
@@ -1,264 +0,0 @@
1%module VisionProxy
2%{
3#include "vision.h"
4#include "sikuli-debug.h"
5#include <iostream>
6#include "opencv.hpp"
7#include "cvgui.h"
8#include "tessocr.h"
9%}
10
11%include "std_vector.i"
12%include "std_string.i"
13%include "typemaps.i"
14%include "various.i"
15
16%pragma(java) jniclassimports=%{
17 import com.wapmx.nativeutils.jniloader.NativeLoader;
18%}
19
20%pragma(java) jniclasscode=%{
21 static {
22 try {
23 NativeLoader.loadLibrary("VisionProxy");
24 } catch (Exception e) {
25 System.err.println("Failed to load VisionProxy.\n" + e);
26 }
27 }
28%}
29
30
31%template(FindResults) std::vector<FindResult>;
32
33%template(OCRChars) std::vector<OCRChar>;
34%template(OCRWords) std::vector<OCRWord>;
35%template(OCRLines) std::vector<OCRLine>;
36%template(OCRParagraphs) std::vector<OCRParagraph>;
37
38%typemap(jni) unsigned char* "jbyteArray"
39%typemap(jtype) unsigned char* "byte[]"
40%typemap(jstype) unsigned char* "byte[]"
41
42// Map input argument: java byte[] -> C++ unsigned char *
43%typemap(in) unsigned char* {
44 long len = JCALL1(GetArrayLength, jenv, $input);
45 $1 = (unsigned char *)malloc(len + 1);
46 if ($1 == 0) {
47 std::cerr << "out of memory\n";
48 return 0;
49 }
50 JCALL4(GetByteArrayRegion, jenv, $input, 0, len, (jbyte *)$1);
51}
52
53%typemap(freearg) unsigned char* %{
54 free($1);
55%}
56
57// change Java wrapper output mapping for unsigned char*
58%typemap(javaout) unsigned char* {
59 return $jnicall;
60 }
61
62%typemap(javain) unsigned char* "$javainput"
63
64
65struct FindResult {
66 int x, y;
67 int w, h;
68 double score;
69 FindResult(){
70 x=0;y=0;w=0;h=0;score=-1;text = "";
71 }
72 FindResult(int _x, int _y, int _w, int _h, double _score){
73 x = _x; y = _y;
74 w = _w; h = _h;
75 score = _score;
76 text = "";
77 }
78
79 std::string text;
80};
81
82class OCRRect {
83
84public:
85
86 OCRRect();
87 OCRRect(int x_, int y_, int width_, int height_);
88
89 int x;
90 int y;
91 int height;
92 int width;
93
94};
95
96class OCRChar : public OCRRect{
97
98public:
99
100 OCRChar(const std::string& ch_, int x_, int y_, int width_, int height_)
101 : ch(ch_), OCRRect(x_,y_,width_,height_){};
102
103 std::string ch;
104};
105
106class OCRWord : public OCRRect {
107
108public:
109 float score;
110 std::string getString();
111
112 std::vector<OCRChar> getChars();
113};
114
115class OCRLine : public OCRRect{
116public:
117
118 std::string getString();
119 std::vector<OCRWord> getWords();
120
121};
122
123class OCRParagraph : public OCRRect{
124public:
125
126 std::vector<OCRLine> getLines();
127
128};
129
130class OCRText : public OCRRect{
131
132public:
133
134 std::string getString();
135
136 std::vector<OCRWord> getWords();
137 std::vector<OCRParagraph> getParagraphs();
138
139};
140
141class Blob : public cv::Rect{
142
143public:
144
145 Blob(){};
146 Blob(const cv::Rect& rect);
147
148 bool isContainedBy(Blob& b);
149
150 double area;
151 int mb;
152 int mg;
153 int mr;
154 int score;
155};
156
157%include "enumtypeunsafe.swg"
158%javaconst(1);
159enum TARGET_TYPE{
160 IMAGE,
161 TEXT,
162 BUTTON
163};
164
165namespace sikuli {
166
167 class FindInput{
168
169 public:
170
171 FindInput();
172 FindInput(cv::Mat source, cv::Mat target);
173 FindInput(cv::Mat source, int target_type, const char* target);
174
175 FindInput(const char* source_filename, int target_type, const char* target);
176
177 FindInput(cv::Mat source, int target_type);
178 FindInput(const char* source_filename, int target_type);
179
180 // copy everything in 'other' except for the source image
181 FindInput(cv::Mat source, const FindInput other);
182
183 void setSource(const char* source_filename);
184 void setTarget(int target_type, const char* target_string);
185
186 void setSource(cv::Mat source);
187 void setTarget(cv::Mat target);
188
189 cv::Mat getSourceMat();
190 cv::Mat getTargetMat();
191
192 void setFindAll(bool all);
193 bool isFindingAll();
194
195 void setLimit(int limit);
196 int getLimit();
197
198 void setSimilarity(double similarity);
199 double getSimilarity();
200
201 int getTargetType();
202
203 std::string getTargetText();
204 };
205
206 class Vision{
207 public:
208
209 static std::vector<FindResult> find(FindInput q);
210 static std::vector<FindResult> findChanges(FindInput q);
211
212 static double compare(cv::Mat m1, cv::Mat m2);
213
214 static void initOCR(const char* ocrDataPath);
215
216 static std::string query(const char* index_filename, cv::Mat image);
217
218 static OCRText recognize_as_ocrtext(cv::Mat image);
219
220 static std::vector<FindResult> findBlobs(const cv::Mat& image, bool textOnly=false);
221
222 static std::vector<FindResult> findTextBlobs(const cv::Mat& image);
223
224 static std::string recognize(cv::Mat image);
225 static std::string recognizeWord(cv::Mat image);
226
227 //helper functions
228 static cv::Mat createMat(int _rows, int _cols, unsigned char* _data);
229
230 static void setParameter(std::string param, float val);
231 static float getParameter(std::string param);
232
233 private:
234
235 };
236
237
238 enum DebugCategories {
239 OCR, FINDER
240 };
241 void setDebug(DebugCategories cat, int level);
242
243
244
245}
246
247class OCR {
248public:
249 static void setParameter(std::string param, std::string value);
250};
251
252
253namespace cv{
254 class Mat {
255 int _w, _h;
256 unsigned char* _data;
257
258 public:
259 //Mat(int _rows, int _cols, int _type, unsigned char* _data);
260 };
261
262}
263
264
2650
=== removed directory '.pc/no-opencv-surf-module.patch'
=== removed directory '.pc/no-opencv-surf-module.patch/sikuli-script'
=== removed directory '.pc/no-opencv-surf-module.patch/sikuli-script/src'
=== removed directory '.pc/no-opencv-surf-module.patch/sikuli-script/src/main'
=== removed directory '.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native'
=== removed file '.pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/cvgui.cpp'
--- .pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/cvgui.cpp 2012-06-25 12:33:23 +0000
+++ .pc/no-opencv-surf-module.patch/sikuli-script/src/main/native/cvgui.cpp 1970-01-01 00:00:00 +0000
@@ -1,2508 +0,0 @@
1/*
2 * Copyright 2010-2011, Sikuli.org
3 * Released under the MIT License.
4 *
5 */
6#include "cvgui.h"
7#include "sikuli-debug.h"
8#include <iostream>
9using namespace std;
10using namespace sikuli;
11
12
13Scalar Color::RED(0,0,255);
14Scalar Color::WHITE(255,255,255);
15
16Scalar Color::RANDOM() {
17 return Scalar(rand()&255, rand()&255, rand()&255);
18};
19
20static bool sort_by_x (Rect a, Rect b){
21 return (a.x < b.x);
22}
23
24static bool sort_blob_by_x(Blob a, Blob b){
25 return (a.x < b.x);
26}
27
28static bool sort_blob_by_y(Blob a, Blob b){
29 return (a.y < b.y);
30}
31
32#define SHOW(x) namedWindow(#x,1); imshow(#x,x);
33#define SHOW0(x) namedWindow(#x,1); imshow(#x,x); waitKey(0);
34
35//class VisualLogger{
36//
37//
38// int image_i;
39// int step_i;
40// char* prefix;
41//
42//public:
43//
44// VisualLogger(){
45// }
46//
47// static void newImage(){
48// image_i++;
49// step_i = 0;
50// }
51//
52// static void log(const char* name, const Mat& image){
53// char buf[200];
54//
55// if (prefix){
56//
57// sprintf(buf, "%s-%02d-%s.vlog.png", prefix, step_i, name);
58//
59// }else{
60// sprintf(buf, "%03d-%02d-%s.vlog.png",image_i,step_i,name);
61// }
62//
63// imwrite(buf, image);
64//
65// step_i++;
66// }
67//};
68//
69//static VisualLogger vlog;
70
71int VisualLogger::image_i = 0;
72int VisualLogger::step_i = 0;
73//bool VisualLogger::enabled = false;
74char* VisualLogger::prefix = 0;
75
76//#define VLOG(x,y)
77
78void
79Util::rgb2grayC3(const Mat& input, Mat& output){
80 Mat g;
81 cvtColor(input, g, CV_RGB2GRAY);
82 Mat ss[3] = {g,g,g};
83 merge(ss,3,output);
84}
85
86void
87Util::growRect(Rect& rect, int xd, int yd, Rect bounds){
88
89
90 Rect in = rect;
91 in.x -= xd;
92 in.width += 2*xd;
93 in.y -= yd;
94 in.height += 2*yd;
95
96 int x1 = max(bounds.x, in.x);
97 int y1 = max(bounds.y, in.y);
98 int x2 = min(in.x + in.width, bounds.width);
99 int y2 = min(in.y + in.height, bounds.height);
100
101 if (x2 < x1 || y2 < y1)
102 rect = Rect(0,0,0,0);
103 else
104 rect = Rect(x1,y1,x2-x1+1,y2-y1+1);
105
106}
107
108void
109Util::growRect(Rect& rect, int xd, int yd, cv::Mat image){
110 growRect(rect, xd, yd, Rect(0,0, image.cols-1, image.rows-1));
111}
112
113
114
115void
116Painter::drawRect(Mat& image, Rect r, Scalar color){
117 rectangle(image,
118 Point(r.x, r.y),
119 Point(r.x + r.width, r.y + r.height),
120 color);
121}
122
123void
124Painter::drawRect(Mat& image, OCRRect r, Scalar color){
125 rectangle(image,
126 Point(r.x, r.y),
127 Point(r.x + r.width, r.y + r.height),
128 color);
129}
130
131void
132Painter::drawRects(Mat& image, vector<Rect>& rects, Scalar color){
133 for (vector<Rect>::iterator r = rects.begin();
134 r != rects.end(); ++r){
135
136 rectangle(image,
137 Point(r->x, r->y),
138 Point(r->x + r->width, r->y + r->height),
139 color);
140 }
141}
142
143
144
145void
146Painter::drawBlobsRandomShading(Mat& image, vector<Blob>& blobs){
147
148
149 Mat blank = image.clone();
150 blank = 0.0;
151
152 Mat shading = blank;
153 for (vector<Blob>::iterator it = blobs.begin();
154 it != blobs.end(); ++it){
155 Blob& box = *it;
156 rectangle(shading, Point(box.x,box.y), Point(box.x+box.width,box.y+box.height), Color::RANDOM(), CV_FILLED);
157 }
158
159 image = image * 0.5 + shading * 0.7;
160
161 Painter::drawBlobs(image, blobs, Color::WHITE);
162}
163
164void
165Painter::drawRects(Mat& image, vector<Rect>& rects){
166 drawRects(image, rects, Scalar(0,0,255));
167}
168
169void
170Painter::drawBlobs(Mat& image, vector<Blob>& blobs){
171 for (vector<Blob>::iterator it = blobs.begin();
172 it != blobs.end(); ++it){
173
174 Blob& blob = *it;
175
176 Scalar color(blob.mr,blob.mg,blob.mb);
177 vector<Rect> rs;
178 rs.push_back(blob);
179 drawRects(image, rs, color);
180 }
181}
182
183void
184Painter::drawBlobs(Mat& image, vector<Blob>& blobs, Scalar color){
185 vector<Rect> rs;
186
187 for (vector<Blob>::iterator it = blobs.begin();
188 it != blobs.end(); ++it){
189
190 Blob& blob = *it;
191 rs.push_back(blob);
192 }
193 drawRects(image, rs, color);
194}
195
196void
197Painter::drawLineBlobs(Mat& image, vector<LineBlob>& lineblobs, Scalar color){
198 for (vector<LineBlob>::iterator it1 = lineblobs.begin();
199 it1 != lineblobs.end(); ++it1){
200
201 LineBlob& lineblob = *it1;
202
203
204 if (lineblob.blobs.size()>=2){
205
206 for (vector<Blob>::iterator r = lineblob.blobs.begin() + 1;
207 r != lineblob.blobs.end(); ++r){
208
209 Rect previous = *(r-1);
210 Rect current = *r;
211
212 Point from(previous.x+previous.width,previous.y);
213 Point to(current.x,current.y);
214 cv::line(image, from, to, Scalar(255,255,255));
215 }
216 }
217
218 drawRect(image, lineblob, color);
219 }
220}
221
222void
223Painter::drawParagraphBlobs(Mat& image, vector<ParagraphBlob> blobs, Scalar color){
224 for (vector<ParagraphBlob>::iterator it = blobs.begin();
225 it != blobs.end(); ++it){
226
227 ParagraphBlob& parablob = *it;
228 for (vector<LineBlob>::iterator it1 = parablob.lineblobs.begin();
229 it1 != parablob.lineblobs.end(); ++it1){
230
231 LineBlob& lineblob = *it1;
232 drawRect(image, lineblob, Scalar(255,255,0));
233 }
234
235 drawRect(image, parablob, Scalar(0,0,255));
236
237 }
238}
239
240void
241Painter::drawOCRWord(Mat& ocr_result_image, OCRWord ocrword){
242
243 cout << ocrword.x << " " << ocrword.y << " " << ocrword.width << " " << ocrword.height << ": ";
244 cout << ocrword.getString() << endl;
245
246 drawRect(ocr_result_image, ocrword, Scalar(255,255,0));
247 Point pt(ocrword.x, ocrword.y + ocrword.height - 10);
248 putText(ocr_result_image, ocrword.getString(), pt,
249 FONT_HERSHEY_SIMPLEX, 0.4, Color::RED);
250
251}
252
253void
254Painter::drawOCRLine(Mat& ocr_result_image, OCRLine ocrline){
255 vector<OCRWord> ocrwords = ocrline.getWords();
256 for (vector<OCRWord>::iterator it = ocrwords.begin(); it != ocrwords.end(); ++it){
257 OCRWord& ocrword = *it;
258 drawOCRWord(ocr_result_image, ocrword);
259 }
260}
261
262void
263Painter::drawOCRParagraph(Mat& ocr_result_image, OCRParagraph ocrpara){
264 vector<OCRLine> ocrlines = ocrpara.getLines();
265 for (vector<OCRLine>::iterator it = ocrlines.begin(); it != ocrlines.end(); ++it){
266 OCRLine& ocrline = *it;
267 drawOCRLine(ocr_result_image, ocrline);
268 }
269}
270
271void
272Painter::drawOCRText(Mat& ocr_result_image, OCRText ocrtext){
273 vector<OCRParagraph> ocrparas = ocrtext.getParagraphs();
274 for (vector<OCRParagraph>::iterator it = ocrparas.begin(); it != ocrparas.end(); ++it){
275 OCRParagraph& ocrpara = *it;
276 drawOCRParagraph(ocr_result_image, ocrpara);
277 }
278}
279
280
281
282
283void
284LineBlob::merge(LineBlob& blob){
285
286 for (vector<Blob>::iterator it = blob.blobs.begin();
287 it != blob.blobs.end(); ++it){
288 add(*it);
289 }
290
291}
292
293void
294LineBlob::updateBoundingRect(Blob& blob){
295 if (blobs.size() == 0){
296 x = blob.x;
297 y = blob.y;
298 height = blob.height;
299 width = blob.width;
300
301 }else{
302
303 int x1,y1,x2,y2;
304 x1 = min(x, blob.x);
305 y1 = min(y, blob.y);
306 x2 = max(x+width, blob.x + blob.width);
307 y2 = max(y+height, blob.y + blob.height);
308
309 x = x1;
310 y = y1;
311 height = y2 - y1;
312 width = x2 - x1;
313 }
314}
315
316void
317LineBlob::add(Blob& blob){
318 updateBoundingRect(blob);
319 blobs.push_back(blob);
320}
321
322void
323LineBlob::calculateBoundingRectangle(){
324 int x1,y1,x2,y2;
325 Blob& first_blob = blobs.front();
326 x1 = first_blob.x;
327 x2 = first_blob.x + first_blob.width;
328 y1 = first_blob.y;
329 y2 = first_blob.y + first_blob.height;
330
331 for (vector<Blob>::iterator it_line = blobs.begin()+1;
332 it_line != blobs.end(); ++it_line){
333 Blob& b = *it_line;
334 x1 = min(x1, b.x);
335 y1 = min(y1, b.y);
336 x2 = max(x2, b.x + b.width);
337 y2 = max(y2, b.y + b.height);
338 }
339
340 x = x1;
341 y = y1;
342 height = y2 - y1;
343 width = x2 - x1;
344}
345
346void
347ParagraphBlob::add(LineBlob& blob){
348
349 if (lineblobs.size() == 0){
350 x = blob.x;
351 y = blob.y;
352 height = blob.height;
353 width = blob.width;
354
355 }else{
356
357 int x1,y1,x2,y2;
358 x1 = min(x, blob.x);
359 y1 = min(y, blob.y);
360 x2 = max(x+width, blob.x + blob.width);
361 y2 = max(y+height, blob.y + blob.height);
362
363 x = x1;
364 y = y1;
365 height = y2 - y1;
366 width = x2 - x1;
367 }
368 lineblobs.push_back(blob);
369}
370
371
372
373void denoise(Mat& src){
374
375 //src = src * 0.1;
376
377 Mat kernel = Mat::ones(3,3,CV_32FC1);
378 kernel.at<float>(2,2) = 0;
379
380 Mat srcF, destF;
381 src.convertTo(srcF, CV_32FC1, 0.1);
382
383 filter2D(srcF, destF, -1, kernel);
384
385 Mat destU;
386 destF.convertTo(destU, CV_8UC1);
387
388 threshold(destU, destU, 60, 255, THRESH_BINARY);
389
390 bitwise_and(src, destU, src);
391}
392
393
394
395
396void
397cvgui::linkLineBlobsIntoPagagraphBlobs(vector<LineBlob>& blobs, vector<ParagraphBlob>& parablobs){
398
399 sort(blobs, sort_blob_by_y);
400
401 for (vector<LineBlob>::iterator it = blobs.begin();
402 it != blobs.end(); ++it){
403
404 LineBlob& blob = *it;
405
406 vector<ParagraphBlob>::iterator it1;
407 for (it1 = parablobs.begin();
408 it1 != parablobs.end(); ++it1){
409
410 ParagraphBlob& parablob = *it1;
411
412 bool left_aligned = abs(parablob.x - blob.x) < 10;
413 bool small_vertical_spacing = abs(blob.y - (parablob.y + parablob.height)) < 15;
414
415 bool same_paragraph = left_aligned & small_vertical_spacing;
416
417 if (same_paragraph){
418 parablob.add(blob);
419 break;
420 }
421 }
422
423 if (it1 == parablobs.end()){
424 ParagraphBlob new_parablob;
425 new_parablob.add(blob);
426 parablobs.push_back(new_parablob);
427 }
428 }
429}
430
431void
432cvgui::mergeLineBlobs(vector<LineBlob>& blobs, vector<LineBlob>& merged_blobs){
433
434 sort(blobs, sort_blob_by_x);
435
436 for (vector<LineBlob>::iterator it = blobs.begin();
437 it != blobs.end(); ++it){
438
439 LineBlob& blob = *it;
440
441 vector<LineBlob>::iterator l;
442 for (l = merged_blobs.begin(); l != merged_blobs.end(); ++l){
443
444 LineBlob& merged_blob = *l;
445
446 bool similar_baseline = abs((merged_blob.y + merged_blob.height) - (blob.y + blob.height)) < 5;
447 bool small_spacing = (blob.x - (merged_blob.x + merged_blob.width)) < 10;
448
449 bool cond1 = merged_blob.isContainedBy(blob) || blob.isContainedBy(merged_blob);
450
451 bool same_line = cond1 || (similar_baseline && small_spacing);
452
453 if (same_line){
454 merged_blob.merge(blob);
455 break;
456 }
457 }
458
459 if (l == merged_blobs.end()){
460 merged_blobs.push_back(blob);
461 }
462
463 }
464}
465
466void
467cvgui::linkBlobsIntoLineBlobs(vector<Blob>& blobs, vector<LineBlob>& lines, int max_spacing){
468
469
470 sort(blobs, sort_blob_by_x);
471 for (vector<Blob>::iterator it = blobs.begin();
472 it != blobs.end(); ++it){
473
474 Blob& blob = *it;
475
476 vector<LineBlob>::iterator l;
477 for (l = lines.begin(); l != lines.end(); ++l){
478
479 LineBlob& line = *l;
480 Blob& last = line.blobs.back();
481
482 bool similar_baseline = abs((last.y + last.height) - (blob.y + blob.height)) < 5;
483 bool similar_centerline = abs((last.y + last.height/2) - (blob.y + blob.height/2)) < 5;
484 bool similar_height = 1.0*min(last.height,blob.height)/max(last.height,blob.height) > 0.5;
485 bool similar_width = 1.0*min(last.width,blob.width)/max(last.width,blob.width) > 0.5;
486
487 bool small_overlap = blob.x > ((last.x + last.width)-2);
488
489
490 bool small_spacing = (blob.x - (last.x + last.width)) < max_spacing;
491
492 bool is_dot = blob.height < 3 && blob.width < 3 && similar_baseline && small_spacing;
493
494 int th = 40;
495 bool similar_foreground_color =
496 abs(last.mr - blob.mr) < th && abs(last.mg - blob.mg) < th && abs(last.mb - blob.mb) < th;
497
498
499 //bool is_probably_i = blob.width < 2 || last.width < 2;
500
501
502 bool same_line = (similar_centerline || similar_baseline)
503 && similar_height
504 && small_overlap
505 //&& similar_width
506 && small_spacing
507 && similar_foreground_color; //|| is_probably_i);
508
509
510 bool very_close = (blob.x - (last.x + last.width)) < 3;
511
512 // bool vertically_overlap = similar_baseline;
513
514 if (same_line || (very_close && similar_height && similar_baseline)){
515 line.add(blob);
516 break;
517 }
518 }
519
520 if (l == lines.end()){
521
522 LineBlob newline;
523 newline.add(blob);
524 lines.push_back(newline);
525 }
526
527 }
528}
529
530
531void
532cvgui::run_ocr_on_lineblobs(vector<LineBlob>& ocr_input_lineblobs,
533 Mat& input_image,
534 vector<OCRLine>& ocrlines){
535
536
537 for (vector<LineBlob>::iterator it = ocr_input_lineblobs.begin();
538 it != ocr_input_lineblobs.end(); ++it){
539
540 LineBlob& lineblob = *it;
541 OCRLine ocrline;
542 OCRWord ocrword;
543
544 // if (lineblob.blobs.size()<10)
545 // continue;
546 //
547
548
549 Mat wordImage(input_image,lineblob);
550
551 Mat ocrImage; // the image passed to tesseract
552 bool upsampled = false;
553 if (wordImage.rows < 20){
554 upsampled = true;
555 resize(wordImage, ocrImage, Size(wordImage.cols*2,wordImage.rows*2));
556 }else {
557 ocrImage = wordImage.clone();
558 }
559
560 vector<OCRChar> ocr_chars;
561 ocr_chars = OCR::recognize((unsigned char*)ocrImage.data,
562 ocrImage.cols,
563 ocrImage.rows,
564 8);
565
566 for (vector<OCRChar>::iterator iter = ocr_chars.begin();
567 iter != ocr_chars.end(); iter++){
568
569
570 OCRChar& ocrchar = *iter;
571
572
573 if (upsampled){
574 // scale back the coordinates in the OCR result
575
576 ocrchar.x = ocrchar.x/2;
577 ocrchar.y = ocrchar.y/2;
578 ocrchar.width = ocrchar.width/2;
579 ocrchar.height = ocrchar.height/2;
580 }
581
582
583 ocrchar.x += lineblob.x;
584 ocrchar.y += lineblob.y;
585
586
587
588 if (iter > ocr_chars.begin()){
589 OCRChar& previous_ocrchar = *(iter-1);
590
591 int spacing = ocrchar.x - (previous_ocrchar.x + previous_ocrchar.width);
592 //dout() << '[' << ocrchar.height << ':' << spacing << ']';
593 //dout() << '[' << spacing << ']';
594
595
596 if (lineblob.height > 6 && spacing >= 4){// || spacing >= 2){
597 ocrline.addWord(ocrword);
598 ocrword.clear();
599 //dout() << ' ';
600 }
601 }
602
603 //dout() << ocrchar.ch;
604
605 ocrword.add(ocrchar);
606 ocrword.y = lineblob.y;
607 ocrword.height = lineblob.height;
608
609
610
611
612
613 }
614
615
616 ocrline.addWord(ocrword);
617
618 //dout() << endl;
619
620
621 ocrlines.push_back(ocrline);
622
623 }
624}
625
626void getLeafBlobs(vector<Blob>& blobs, vector<Blob>& leaf_blobs){
627
628 leaf_blobs.clear();
629
630 for (vector<Blob>::iterator it = blobs.begin();
631 it != blobs.end(); ++it){
632
633 Blob& a = *it;
634
635 // check if blob 'a' contains any other blob
636 vector<Blob>::iterator it1;
637 for (it1 = blobs.begin();
638 it1 != blobs.end(); ++it1){
639
640 Blob& b = *it1;
641
642 if (it != it1 && b.isContainedBy(a))
643 break;
644 }
645
646 // if not, it is a leave blob
647 if (it1 == blobs.end())
648 leaf_blobs.push_back(a);
649
650 }
651}
652
653
654Mat
655cvgui::findBoxesByVoting(const Mat& screen,
656 int bw, int bh,
657 vector<Blob>& output_blobs){
658
659 Mat dark;
660 Util::rgb2grayC3(screen,dark);
661 dark = dark * 0.5;
662
663
664 VLOG("Input", screen);
665
666 Mat gray;
667 cvtColor(screen,gray,CV_RGB2GRAY);
668
669
670 // Code for experimenting differenty parameters for Canny
671 // for (int c=10;c<=100;c=c+10){
672 // char buf[50];
673 // Mat test;
674 // sprintf(buf,"Canny%d",c);
675 // Canny(gray,test,0.66*c,1.33*c,3,true);
676 // VLOG(buf, test);
677 // }
678
679 Mat canny;
680 int s = 200;
681 Canny(gray,canny,0.66*s,1.33*s,3,true);
682 VLOG("Canny", canny);
683
684 Mat edges;
685 Mat v = Mat::ones(2,2,CV_8UC1);
686
687 dilate(canny, edges, v);
688 erode(edges, edges, v);
689
690 dilate(edges, edges, Mat::ones(3,3,CV_8UC1));
691 VLOG("Dilated", edges);
692
693 double k = 0.85;
694 double tol = 0.10;
695 Mat q = Mat::ones(5,5,CV_8UC1);
696
697 Mat h1,h2,hvotes;
698 voteCenter_Horizontal(edges, h1, bw*k, bw*tol, bh/2);
699 dilate(h1, h1, q);
700 voteCenter_Horizontal(edges, h2, bw*k, bw*tol, -bh/2);
701 dilate(h2, h2, q);
702
703 bitwise_and(h1,h2,hvotes);
704 VLOG("H-votes", hvotes);
705
706
707 Mat v1,v2,vvotes;
708 voteCenter_Vertical(edges, v1, bh*k, bh*tol, bw/2);
709 dilate(v1, v1, q);
710
711 voteCenter_Vertical(edges, v2, bh*k, bh*tol, -bw/2);
712 dilate(v2, v2, q);
713
714 bitwise_and(v1,v2,vvotes);
715 VLOG("V-votes", vvotes);
716
717 Mat hvvotes;
718 bitwise_and(vvotes,hvotes,hvvotes);
719 VLOG("HV-votes", hvvotes);
720
721
722
723
724 Mat copy = hvvotes.clone();
725
726
727 vector<vector<Point> > contours;
728 vector<Vec4i> hierarchy;
729
730 findContours( copy, contours, hierarchy,
731 CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
732
733 vector<Blob> blobs;
734
735 Mat blank = dark.clone();
736 blank = 0.0;
737
738 Mat contour_shading = blank;
739
740
741 // define a perfect box for back-proj verification
742 Mat pbox = Mat::zeros(bh,bw,CV_8UC1);
743 pbox.row(0).setTo(255);
744 pbox.row(bh-1).setTo(255);
745 pbox.col(0).setTo(255);
746 pbox.col(bw-1).setTo(255);
747 int pscore = countNonZero(pbox);
748
749 for (vector<vector<Point> >::iterator it = contours.begin();
750 it != contours.end(); ++it){
751
752 vector<Point>& contour = *it;
753
754 Rect r = boundingRect(Mat(contour));
755
756 double a1 = contourArea(Mat(contour));
757 double a2 = r.height * r.width;
758
759 int cx = r.x + r.width/2;
760 int cy = r.y + r.height/2;
761
762
763 Rect box(cx-bw/2,cy-bh/2,bw,bh);
764
765 Mat e(edges, box);
766 // calculate the score by comparing each hypothesized box to the ideal box
767 Mat sc;
768 bitwise_and(e,pbox,sc);
769 int score = countNonZero(sc);
770
771 // ignore those boxes with fewer than this percentage
772 // of edge pixels
773 if ((1.0 * score) / (1.0 * pscore) < 0.90)
774 continue;
775
776 // rectangle(contour_shading, Point(box.x,box.y), Point(box.x+box.width,box.y+box.height), Color::RANDOM(), CV_FILLED);
777
778
779 Blob blob(box);
780 blob.score = score;
781 blobs.push_back(blob);
782
783 }
784
785
786 Mat blobs_image = dark.clone();
787
788 Painter::drawBlobsRandomShading(blobs_image, blobs);
789 VLOG("BlobHypotheses", blobs_image);
790
791
792 // remove overlapping blobs
793 // and do non-maximal suppression
794 vector<Blob> nonoverlapping_blobs;
795
796 for (vector<Blob>::iterator it = blobs.begin();
797 it != blobs.end(); ++it){
798
799 Blob& b = *it;
800
801 bool not_overlap = true;
802 int tolerance = 3;
803 vector<Blob>::iterator ito;
804 for (ito = nonoverlapping_blobs.begin();
805 ito != nonoverlapping_blobs.end(); ++ito){
806
807 Blob& bo = *ito;
808
809 not_overlap = b.x >= bo.x + bo.width - tolerance || b.y >= bo.y + bo.height - tolerance||
810 b.x + b.width <= bo.x + tolerance|| b.y + b.height <= bo.y + tolerance;
811
812 if (!not_overlap)
813 break;
814
815 }
816
817 if (not_overlap){
818
819 nonoverlapping_blobs.push_back(b);
820
821 }else{
822 // replace it if the score is better
823
824 if (it->score > ito->score){
825
826 (*ito) = (*it);
827 }
828
829 }
830
831 }
832
833
834 vector<Blob>& result_blobs = nonoverlapping_blobs;
835
836
837 Mat result_blobs_image = dark.clone();
838 Painter::drawBlobsRandomShading(result_blobs_image, result_blobs);
839 VLOG("OutputBlobs", result_blobs_image);
840
841 // print output to stdout
842 for (vector<Blob>::iterator it = result_blobs.begin();
843 it != result_blobs.end(); ++it){
844 Blob& b = *it;
845 dout() << b.x << " " << b.y << " " << b.width << " " << b.height << " " << b.score << endl;
846 }
847
848
849 return result_blobs_image;
850}
851
852Mat
853cvgui::findPokerBoxes(const Mat& screen, vector<Blob>& output_blobs){
854
855
856 //return findBoxesByVoting(screen, 70, 90, output_blobs);
857 return findBoxesByVoting(screen, 40, 50, output_blobs);
858
859
860// old algorithm
861#if 0
862 Mat dark;
863 Util::rgb2grayC3(screen,dark);
864 dark = dark * 0.5;
865
866
867 VLOG("Input", screen);
868
869 Mat gray;
870 cvtColor(screen,gray,CV_RGB2GRAY);
871
872 //medianBlur(gray, gray, 3);
873 //VLOG("Blurred", gray);
874
875 Mat edges;
876
877 // Code for experimenting differenty parameters for Canny
878 // for (int c=10;c<=100;c=c+10){
879 // char buf[50];
880 // Mat test;
881 // sprintf(buf,"Canny%d",c);
882 // Canny(gray,test,0.66*c,1.33*c,3,true);
883 // VLOG(buf, test);
884 // }
885
886 int s = 100;
887 Canny(gray,edges,0.66*s,1.33*s,3,true);
888 VLOG("Canny", edges);
889
890
891 Mat v = Mat::ones(2,2,CV_8UC1);
892
893 dilate(edges, edges, v);
894 erode(edges, edges, v);
895
896 VLOG("Dilated", edges);
897
898 // experimental
899 Mat hlines,vlines;
900 dilate(edges, edges, Mat::ones(3,2,CV_8UC1));
901
902
903 findLongLines_Vertical(edges,vlines, 50, 2);
904 VLOG("V-lines", vlines);
905
906 findLongLines_Horizontal(edges,hlines, 50, 2);
907 VLOG("H-lines", hlines);
908
909
910 int bw = 70;
911 int bh = 20;
912 double k = 0.90;
913
914 Mat q = Mat::ones(5,5,CV_8UC1);
915
916 Mat h1,h2,hvotes;
917 voteCenter_Horizontal(edges, h1, bw*k, 2, bh/2);
918 dilate(h1, h1, q);
919 voteCenter_Horizontal(edges, h2, bw*k, 2, -bh/2);
920 dilate(h2, h2, q);
921
922 bitwise_and(h1,h2,hvotes);
923 VLOG("H-votes", hvotes);
924
925
926 Mat v1,v2,vvotes;
927 voteCenter_Vertical(edges, v1, bh*k, 2, bw/2);
928 dilate(v1, v1, q);
929
930 voteCenter_Vertical(edges, v2, bh*k, 2, -bw/2);
931 dilate(v2, v2, q);
932
933 bitwise_and(v1,v2,vvotes);
934 VLOG("V-votes", vvotes);
935
936 Mat hvvotes;
937 bitwise_and(vvotes,hvotes,hvvotes);
938 VLOG("HV-votes", hvvotes);
939
940
941// Mat hvlines;
942// bitwise_or(hlines, vlines, hvlines);
943// VLOG("HV-lines", hvlines);
944
945 //
946
947 Mat lines;
948 findLongLines(edges, lines, 15);
949
950 Mat w = Mat::ones(5,5,CV_8UC1);
951 dilate(lines, lines, w);
952 erode(lines, lines, w);
953
954 VLOG("Lines", lines);
955
956
957 Mat lines2;
958 Mat z = Mat::ones(2,2,CV_8UC1);
959
960 dilate(lines, lines, z);
961
962 findLongLines(lines, lines2, 30, 15);
963
964 //dilate(lines2, lines2, z);
965 //erode(lines2, lines2, z);
966
967 VLOG("Lines2", lines2);
968
969
970
971 Mat result = dark.clone();
972 //Mat copy = edges.clone();
973 //Mat copy = lines.clone();
974
975 Mat copy = lines2.clone();
976
977
978 vector<vector<Point> > contours;
979 vector<Vec4i> hierarchy;
980
981 findContours( copy, contours, hierarchy,
982 CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
983
984 vector<Blob> blobs;
985
986 Mat blank = dark.clone();
987 blank = 0.0;
988
989 Mat contour_shading = blank;//dark.clone();
990
991 for (vector<vector<Point> >::iterator it = contours.begin();
992 it != contours.end(); ++it){
993
994 vector<Point>& contour = *it;
995
996 Rect r = boundingRect(Mat(contour));
997
998 double a1 = contourArea(Mat(contour));
999 double a2 = r.height * r.width;
1000
1001
1002 if (a2 < 100)
1003 continue;
1004
1005
1006 if (abs(r.width - 65) > 5)
1007 continue;
1008
1009 //if ( min(a1,a2)/max(a1,a2) > 0.80){
1010
1011 vector<vector<Point> > cs;
1012 cs.push_back(contour);
1013 drawContours(contour_shading, cs, -1, Color::RANDOM(), CV_FILLED);
1014
1015
1016 Blob blob(r);
1017 blobs.push_back(blob);
1018 //}
1019
1020 }
1021
1022 Mat contours_image = contour_shading*0.7 + dark*0.5;
1023
1024 Painter::drawBlobs(contours_image, blobs, Color::WHITE);
1025
1026 VLOG("ColoredSelectedContours", contours_image);
1027
1028
1029
1030
1031 vector<Blob> nonoverlapping_blobs;
1032
1033 // print output to stdout
1034 for (vector<Blob>::iterator it = blobs.begin();
1035 it != blobs.end(); ++it){
1036
1037 Blob& b = *it;
1038 bool not_overlap = true;
1039 for (vector<Blob>::iterator ito = nonoverlapping_blobs.begin();
1040 ito != nonoverlapping_blobs.end(); ++ito){
1041
1042 Blob& bo = *ito;
1043
1044 not_overlap = b.x >= bo.x + bo.width || b.y >= bo.y + bo.height ||
1045 b.x + b.width <= bo.x || b.y + b.height <= bo.y;
1046
1047 if (!not_overlap)
1048 break;
1049
1050 }
1051
1052 if (not_overlap){
1053 nonoverlapping_blobs.push_back(b);
1054 }
1055
1056 }
1057
1058
1059 vector<Blob>& result_blobs = nonoverlapping_blobs
1060
1061
1062 Mat blobs_result = dark.clone();
1063 Painter::drawBlobs(blobs_result, result_blobs, Color::RED);
1064
1065 VLOG("OutputBlobs", blobs_result);
1066
1067 // print output to stdout
1068 for (vector<Blob>::iterator it = result_blobs.begin();
1069 it != result_blobs.end(); ++it){
1070
1071 dout() << b.x << " " << b.y << " " << b.width << " " << b.height << endl;
1072 }
1073
1074
1075 return contours_image;
1076#endif
1077}
1078
1079void
1080cvgui::findBoxes(const Mat& screen, vector<Blob>& output_blobs){
1081
1082 Mat dark;
1083 Util::rgb2grayC3(screen,dark);
1084 dark = dark * 0.5;
1085
1086
1087 VLOG("Input", screen);
1088
1089 Mat gray;
1090 cvtColor(screen,gray,CV_RGB2GRAY);
1091
1092 //medianBlur(gray, gray, 3);
1093 //VLOG("Blurred", gray);
1094
1095 Mat edges;
1096
1097// Code for experimenting differenty parameters for Canny
1098// for (int c=10;c<=100;c=c+10){
1099// char buf[50];
1100// Mat test;
1101// sprintf(buf,"Canny%d",c);
1102// Canny(gray,test,0.66*c,1.33*c,3,true);
1103// VLOG(buf, test);
1104// }
1105
1106 int s = 100;
1107 Canny(gray,edges,0.66*s,1.33*s,3,true);
1108 VLOG("Canny", edges);
1109
1110
1111 dilate(edges, edges, Mat::ones(2,2,CV_8UC1));
1112 VLOG("Dilated", edges);
1113
1114
1115
1116
1117 Mat result = dark.clone();
1118 Mat copy = edges.clone();
1119
1120
1121 vector<vector<Point> > contours;
1122 vector<Vec4i> hierarchy;
1123
1124 findContours( copy, contours, hierarchy,
1125 CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
1126
1127// findContours(edges, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
1128
1129 //findContours( copy, contours, hierarchy,
1130 // CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
1131
1132// cout << contours.size() << " " << hierarchy.size() << endl;
1133 // iterate through all the top-level contours,
1134 // draw each connected component with its own random color
1135// int idx = 0;
1136// for( ; idx >= 0; idx = hierarchy[idx][0]){
1137//
1138// vector<Point>& contour = contours[idx];
1139//
1140//
1141// //Scalar color( rand()&255, rand()&255, rand()&255 );
1142// Scalar cyan(255,255,0);
1143// vector<vector<Point> > cs;
1144// cs.push_back(contour);
1145// drawContours( result, cs, -1, cyan, 2);//, CV_FILLED);
1146//
1147// // drawContours( result, contours, idx, color, CV_FILLED, 8, hierarchy );
1148//
1149// }
1150
1151 vector<Blob> blobs;
1152
1153
1154 Mat box_contour_image = dark.clone();
1155
1156 for (vector<vector<Point> >::iterator it = contours.begin();
1157 it != contours.end(); ++it){
1158
1159 vector<Point>& contour = *it;
1160
1161 Rect r = boundingRect(Mat(contour));
1162
1163 double a1 = contourArea(Mat(contour));
1164 double a2 = r.height * r.width;
1165
1166
1167
1168
1169 if ( min(a1,a2)/max(a1,a2) > 0.80){
1170
1171 vector<vector<Point> > cs;
1172 cs.push_back(contour);
1173 drawContours(box_contour_image, cs, -1, Color::RANDOM(), 2);//, CV_FILLED);
1174
1175
1176 Blob blob(r);
1177 blobs.push_back(blob);
1178 }
1179
1180 }
1181
1182
1183 VLOG("Box-shaped contours", box_contour_image);
1184
1185
1186 Mat blobs_result = dark.clone();
1187 Painter::drawBlobs(blobs_result, blobs, Color::RED);
1188
1189 VLOG("Blobs", blobs_result);
1190
1191
1192 vector<Blob> unique_blobs;
1193 for (vector<Blob>::iterator it = blobs.begin();
1194 it != blobs.end(); ++it){
1195
1196 Blob& a = *it;
1197
1198
1199 vector<Blob>::iterator it1;
1200 for (it1 = unique_blobs.begin();
1201 it1 != unique_blobs.end(); ++it1){
1202
1203 Blob& b = *it1;
1204
1205 int d = 5;
1206 bool similar_bounding_box =
1207 abs(a.x-b.x) < d && abs(a.y-b.y) < d &&
1208 abs(a.height-b.height) < 2*d &&
1209 abs(a.width-b.width) < 2*d;
1210
1211
1212 if (similar_bounding_box)
1213 break;
1214
1215 }
1216
1217 // if no blob whose bounding box is similar
1218 if (it1 == unique_blobs.end()){
1219
1220 // add this blob to the list of unique blobs
1221 unique_blobs.push_back(a);
1222 }
1223 }
1224
1225 Mat unique_blobs_result = dark.clone();
1226 Painter::drawBlobs(unique_blobs_result, unique_blobs, Color::RED);
1227
1228 VLOG("UniqueBlobs", unique_blobs_result);
1229
1230
1231 vector<Blob> leaf_blobs;
1232 getLeafBlobs(unique_blobs, leaf_blobs);
1233
1234
1235 Mat leaf_blobs_result = dark.clone();
1236 Painter::drawBlobs(leaf_blobs_result, leaf_blobs, Color::RED);
1237 VLOG("LeafBlobs", leaf_blobs_result);
1238
1239 output_blobs = leaf_blobs;
1240}
1241
1242
1243
1244
1245void
1246cvgui::computeUnitBlobs(const Mat& screen, Mat& output){
1247
1248 VLOG("Input", screen);
1249
1250 Mat gray;
1251 cvtColor(screen,gray,CV_RGB2GRAY);
1252
1253
1254 Mat edges;
1255 Canny(gray,edges,0.66*50,1.33*50,3,true);
1256 VLOG("Canny", edges);
1257
1258// Mat corners;
1259// cornerHarris(gray,corners,10,5,1.0);
1260
1261// Mat corners_result = screen.clone();
1262// vector<Point2f> corners;
1263// goodFeaturesToTrack(gray, corners, 50, 0.5, 10);
1264// for (vector<Point2f>::iterator it = corners.begin(); it != corners.end(); ++it){
1265// Point2f& p = *it;
1266// circle(corners_result, p, 3, Scalar(0,0,255));
1267// }
1268// VLOG("Corners", corners_result);
1269
1270
1271 adaptiveThreshold(gray, gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY_INV, 5, 1);
1272 VLOG("AdaptiveThresholded", gray);
1273
1274 Mat lines;
1275 cvgui::findLongLines(gray, lines);
1276
1277 Mat lines_viz = lines.clone();
1278 dilate(lines_viz, lines_viz, Mat::ones(4,4,CV_8UC1));
1279 VLOG("LongLinesFound", lines_viz);
1280
1281 Mat not_lines;
1282 bitwise_not(lines, not_lines);
1283
1284 Mat foreground;
1285 bitwise_and(gray, not_lines, foreground);
1286
1287 gray.setTo(0, lines);
1288 VLOG("LongLinesRemoved",gray);
1289
1290
1291 dilate(edges, edges, Mat::ones(3,3,CV_8UC1));
1292 bitwise_and(gray, edges, gray);
1293
1294 VLOG("NonEdgeRemoved", gray);
1295
1296 //GaussianBlur(gray, gray, Size(3, 3), 3);
1297 //VLOG("Blurred", gray);
1298
1299 output = gray;
1300}
1301
1302
1303
1304void
1305cvgui::getParagraphBlobs(const Mat& screen, vector<ParagraphBlob>& output_parablobs){
1306
1307 VisualLogger::newImage();
1308 Mat screen_gray;
1309 cvtColor(screen,screen_gray,CV_RGB2GRAY);
1310
1311 Mat blobs_mask;
1312 cvgui::computeUnitBlobs(screen, blobs_mask);
1313
1314 Mat dark;
1315 Util::rgb2grayC3(screen,dark);
1316 dark = dark * 0.5;
1317
1318 vector<Blob> blobs;
1319 cvgui::extractBlobs(blobs_mask, blobs);
1320
1321 cvgui::calculateColor(blobs, screen, blobs_mask);
1322
1323 // draw blobs
1324 Mat result_blobs = dark.clone();
1325 Painter::drawBlobs(result_blobs, blobs, Scalar(255,255,0));
1326 VLOG("blobs-extracted",result_blobs);
1327
1328
1329 vector<Blob> filtered_blobs;
1330 for (vector<Blob>::iterator it = blobs.begin();
1331 it != blobs.end(); ++it){
1332
1333 Blob& blob = *it;
1334
1335 // if (blob.height < 3 && blob.width < 3)
1336 // continue;
1337 //
1338 // if (blob.height < 4)
1339 // continue;
1340
1341 filtered_blobs.push_back(blob);
1342 }
1343
1344 Mat result_filtered_blobs = dark.clone();
1345 Painter::drawBlobs(result_filtered_blobs, filtered_blobs, Scalar(255,255,0));
1346
1347 VLOG("blobs-filtered",result_filtered_blobs);
1348
1349
1350 Mat result_lineblobs = dark.clone();
1351
1352 vector<LineBlob> lineblobs;
1353 cvgui::linkBlobsIntoLineBlobs(filtered_blobs, lineblobs, 20);
1354
1355 Painter::drawLineBlobs(result_lineblobs, lineblobs, Scalar(255,255,0));
1356 VLOG("lineblobs", result_lineblobs);
1357
1358
1359 Mat result_lineblobs_filtered = dark.clone();
1360 vector<LineBlob> filtered_lineblobs;
1361
1362 // Calculate the bounding rectangle of each line of linked blobs
1363 for (vector<LineBlob>::iterator it_lines = lineblobs.begin();
1364 it_lines != lineblobs.end(); ++ it_lines){
1365
1366 LineBlob& line = *it_lines;
1367
1368 // Ignore lines with fewer than X elements
1369 if (line.blobs.size()<2)
1370 continue;
1371
1372
1373 if (line.height < 3)
1374 continue;
1375
1376 filtered_lineblobs.push_back(line);
1377 }
1378
1379
1380
1381 Painter::drawLineBlobs(result_lineblobs_filtered, filtered_lineblobs, Scalar(255,255,0));
1382 VLOG("lineblobs-filtered", result_lineblobs_filtered);
1383
1384
1385 Mat result_merged_blobs = dark.clone();
1386
1387 vector<LineBlob> merged_lineblobs;
1388 cvgui::mergeLineBlobs(filtered_lineblobs, merged_lineblobs);
1389 Painter::drawLineBlobs(result_merged_blobs, merged_lineblobs, Scalar(255,255,0));
1390 VLOG("lineblobs-merged", result_merged_blobs);
1391
1392
1393 vector<ParagraphBlob> parablobs;
1394 cvgui::linkLineBlobsIntoPagagraphBlobs(merged_lineblobs, parablobs);
1395
1396 Mat result_linked_parablobs = dark.clone();
1397
1398 Painter::drawParagraphBlobs(result_linked_parablobs, parablobs, Scalar(255,0,0));
1399
1400 VLOG("paragblobs", result_linked_parablobs);
1401
1402
1403 output_parablobs = parablobs;
1404
1405
1406// Mat screen_dark = screen * 0.2;
1407// Mat ocr_result_image = screen_dark;
1408//
1409//
1410// for (vector<ParagraphBlob>::iterator it = parablobs.begin();
1411// it != parablobs.end(); ++it){
1412//
1413//
1414// ParagraphBlob& parablob = *it;
1415//
1416// vector<OCRLine> ocrlines;
1417//
1418// cvgui::run_ocr_on_lineblobs(parablob.lineblobs, screen_gray, ocrlines);
1419//
1420// Painter::drawOCRLines(ocr_result_image, ocrlines);
1421//
1422// }
1423//
1424// VLOG("OCR-Result", ocr_result_image);
1425
1426
1427}
1428
1429
1430void
1431cvgui::getLineBlobsAsIndividualWords(const Mat& screen, vector<LineBlob>& output_lineblobs){
1432
1433 Mat screen_gray;
1434 cvtColor(screen,screen_gray,CV_RGB2GRAY);
1435
1436 Mat blobs_mask;
1437 cvgui::computeUnitBlobs(screen, blobs_mask);
1438
1439 Mat dark;
1440 Util::rgb2grayC3(screen,dark);
1441 dark = dark * 0.5;
1442
1443 vector<Blob> blobs;
1444 cvgui::extractBlobs(blobs_mask, blobs);
1445
1446 cvgui::calculateColor(blobs, screen, blobs_mask);
1447
1448 // draw blobs
1449 Mat result_blobs = dark.clone();
1450 Painter::drawBlobs(result_blobs, blobs, Scalar(255,255,0));
1451 VLOG("blobs-extracted",result_blobs);
1452
1453
1454 vector<Blob> filtered_blobs;
1455 for (vector<Blob>::iterator it = blobs.begin();
1456 it != blobs.end(); ++it){
1457
1458 Blob& blob = *it;
1459
1460 // if (blob.height < 3 && blob.width < 3)
1461 // continue;
1462 //
1463 // if (blob.height < 4)
1464 // continue;
1465
1466 filtered_blobs.push_back(blob);
1467 }
1468
1469 Mat result_filtered_blobs = dark.clone();
1470 Painter::drawBlobs(result_filtered_blobs, filtered_blobs, Scalar(255,255,0));
1471
1472 VLOG("blobs-filtered",result_filtered_blobs);
1473
1474
1475 Mat result_lineblobs = dark.clone();
1476
1477 vector<LineBlob> lineblobs;
1478 cvgui::linkBlobsIntoLineBlobs(filtered_blobs, lineblobs, 3);
1479
1480 Painter::drawLineBlobs(result_lineblobs, lineblobs, Scalar(255,255,0));
1481 VLOG("lineblobs", result_lineblobs);
1482
1483
1484 Mat result_lineblobs_filtered = dark.clone();
1485 vector<LineBlob> filtered_lineblobs;
1486
1487 // Calculate the bounding rectangle of each line of linked blobs
1488 for (vector<LineBlob>::iterator it_lines = lineblobs.begin();
1489 it_lines != lineblobs.end(); ++ it_lines){
1490
1491 LineBlob& line = *it_lines;
1492
1493 // Ignore lines with fewer than X elements
1494// if (line.blobs.size()<2)
1495// continue;
1496
1497 if (line.height < 3)
1498 continue;
1499
1500 filtered_lineblobs.push_back(line);
1501 }
1502
1503
1504
1505 Painter::drawLineBlobs(result_lineblobs_filtered, filtered_lineblobs, Scalar(255,255,0));
1506 VLOG("lineblobs-filtered", result_lineblobs_filtered);
1507
1508
1509
1510 output_lineblobs = filtered_lineblobs;
1511
1512 // Mat result_merged_blobs = dark.clone();
1513//
1514// vector<LineBlob> merged_lineblobs;
1515// cvgui::mergeLineBlobs(filtered_lineblobs, merged_lineblobs);
1516// Painter::drawLineBlobs(result_merged_blobs, merged_lineblobs, Scalar(255,255,0));
1517// VLOG("lineblobs-merged", result_merged_blobs);
1518//
1519//
1520// vector<ParagraphBlob> parablobs;
1521// cvgui::linkLineBlobsIntoPagagraphBlobs(merged_lineblobs, parablobs);
1522//
1523// Mat result_linked_parablobs = dark.clone();
1524//
1525// Painter::drawParagraphBlobs(result_linked_parablobs, parablobs, Scalar(255,0,0));
1526//
1527// VLOG("paragraph-linked", result_linked_parablobs);
1528//
1529//
1530// Mat screen_dark = screen * 0.2;
1531// Mat ocr_result_image = screen_dark;
1532//
1533//
1534// for (vector<ParagraphBlob>::iterator it = parablobs.begin();
1535// it != parablobs.end(); ++it){
1536//
1537//
1538// ParagraphBlob& parablob = *it;
1539//
1540// vector<OCRLine> ocrlines;
1541//
1542// cvgui::run_ocr_on_lineblobs(parablob.lineblobs, screen_gray, ocrlines);
1543//
1544// Painter::drawOCRLines(ocr_result_image, ocrlines);
1545//
1546// }
1547//
1548// VLOG("OCR-Result", ocr_result_image);
1549}
1550
1551void
1552cvgui::segmentScreenshot(const Mat& screen, vector<Blob>& text_blobs, vector<Blob>& image_blobs){
1553
1554 VLOG("Input", screen);
1555
1556 Mat gray, screen_gray;
1557 if(screen.channels() > 1){
1558 cvtColor(screen,gray,CV_RGB2GRAY);
1559 }
1560 else
1561 gray = screen;
1562
1563 screen_gray = gray.clone();
1564
1565 adaptiveThreshold(gray, gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY_INV, 5, 1);
1566 VLOG("AdaptiveThresholded", gray);
1567
1568
1569 Mat lines;
1570 cvgui::findLongLines(gray, lines);
1571
1572 Mat lines_viz = lines.clone();
1573 dilate(lines_viz, lines_viz, Mat::ones(4,4,CV_8UC1));
1574 VLOG("LongLinesFound", lines_viz);
1575
1576 Mat not_lines;
1577 bitwise_not(lines, not_lines);
1578
1579 Mat foreground;
1580 bitwise_and(gray, not_lines, foreground);
1581
1582 gray.setTo(0, lines);
1583 VLOG("LongLinesRemoved",gray);
1584
1585
1586 denoise(gray);
1587 VLOG("NoiseRemoved", gray);
1588
1589 dilate(gray,gray,Mat::ones(1,3,CV_8UC1));
1590 VLOG("Dilated",gray);
1591
1592 vector<Rect> rects;
1593 //cvgui::extractRects(gray, rects);
1594
1595 vector<Blob> blobs;
1596 cvgui::extractBlobs(gray, blobs);
1597
1598
1599 Mat dilated = gray.clone();
1600
1601
1602 // visualization
1603 Mat result;
1604 Mat g;
1605 cvtColor(screen, g, CV_RGB2GRAY);
1606
1607 Mat ss[3] = {g,g,g};
1608 merge(ss,3,result);
1609 result = result * 0.5;
1610
1611 Mat bg = result.clone();
1612 Mat screen_darken = bg.clone();
1613
1614
1615 text_blobs.clear();
1616
1617 for (vector<Blob>::iterator b = blobs.begin(); b != blobs.end(); ++b){
1618
1619 Blob& blob = *b;
1620 Rect& bound = blob;
1621 Mat part(screen, bound);
1622 //paste(part, result, r->x, r->y);
1623
1624 Mat p = part.clone();
1625 Mat g;
1626 cvtColor(p, g, CV_RGB2GRAY);
1627 adaptiveThreshold(g, g, 255,
1628 ADAPTIVE_THRESH_MEAN_C,
1629 THRESH_BINARY_INV, 3, 1);
1630 vector<Rect> rs;
1631 cvgui::extractSmallRects(g, rs);
1632 for (vector<Rect>::iterator r = rs.begin();r != rs.end(); ++r){
1633 r->x += bound.x;
1634 r->y += bound.y;
1635 }
1636
1637 vector<Rect> rs0;
1638 for (vector<Rect>::iterator q = rs.begin();
1639 q != rs.end(); ++q){
1640
1641 // exclude overly short element (e.g., dot of i)
1642 if (q->height < 5)
1643 continue;
1644
1645 rs0.push_back(*q);
1646 }
1647
1648 rs = rs0;
1649
1650 // re-calculate the bounds
1651 int x1,y1,x2,y2;
1652 x1 = bound.x + bound.width;
1653 y1 = bound.y + bound.height;
1654 x2 = bound.x;
1655 y2 = bound.y;
1656
1657 for (vector<Rect>::iterator r = rs.begin();
1658 r != rs.end(); ++r){
1659 x1 = min(x1, r->x);
1660 y1 = min(y1, r->y);
1661 x2 = max(x2, r->x + r->width);
1662 y2 = max(y2, r->y + r->height);
1663 }
1664
1665 //blob.bound = Rect(x1-2,y1-2,x2-x1+4,y2-y1+4);
1666 //blob.bound = Rect(x1,y1,x2-x1,y2-y1);
1667
1668 // make the bound bigger to be consistent with the dilated blobs
1669 blob = Blob(Rect(x1-2,y1-1,x2-x1+4,y2-y1+2));
1670
1671
1672 int MINIMUM_NUM_CHARBLOBS = 2;
1673
1674 if (cvgui::areHorizontallyAligned(rs) && rs.size()>=MINIMUM_NUM_CHARBLOBS)
1675 Painter::drawRects(result, rs, Scalar(0,255,0));
1676 else
1677 Painter::drawRects(result, rs, Scalar(0,0,255));
1678
1679 if (cvgui::areHorizontallyAligned(rs) && rs.size()>=MINIMUM_NUM_CHARBLOBS){
1680 text_blobs.push_back(blob);
1681 }
1682
1683 }
1684
1685 //drawRects(result, rects, Scalar(255,0,0));
1686 Painter::drawBlobs(result, blobs, Scalar(255,0,0));
1687
1688 VLOG("TextBlocksExtracted",result);
1689
1690
1691
1692 Mat text_mask = Mat::zeros(screen.size(), CV_8UC1);
1693
1694
1695 for (vector<Blob>::iterator b = text_blobs.begin();
1696 b != text_blobs.end(); ++b){
1697
1698 Rect& r = *b;
1699 Mat m(text_mask,
1700 Range(r.y,r.y+r.height),
1701 Range(r.x,r.x+r.width));
1702
1703 m = 255;
1704
1705 }
1706
1707 VLOG("TextBinaryMaskComputed", text_mask);
1708
1709
1710
1711
1712 gray.setTo(0, text_mask);
1713 VLOG("AfterTextRemoved",gray);
1714
1715 dilate(gray,gray,Mat());
1716 VLOG("DilatedAgain",gray);
1717
1718 Mat dilated_again = gray.clone();
1719
1720 vector<Blob> temp;
1721 //cvgui::extractRects(gray, temp);
1722 cvgui::extractBlobs(gray, temp);
1723
1724 // only keep image rects larger than n pixels
1725
1726 const int MIN_IMAGE_RECT_AREA = 150;
1727
1728 image_blobs.clear();
1729 for (vector<Blob>::iterator b = temp.begin();
1730 b != temp.end(); ++b){
1731
1732 if (b->width * b->height < MIN_IMAGE_RECT_AREA)
1733 continue;
1734
1735 // // blob is too big, something is wrong
1736 // if (b->bound.width > 0.8 * screen.width)
1737 // continue;
1738 // if (b->bound.height > 0.8 * screen.height)
1739 // continue;
1740
1741 image_blobs.push_back(*b);
1742
1743 }
1744
1745 Mat image_result = bg.clone();
1746
1747 Painter::drawBlobs(image_result, image_blobs, Scalar(0,0,255));
1748 VLOG("ImageRecordsExtracted", image_result);
1749
1750 return;
1751
1752 Mat ui_mask = Mat::zeros(screen.size(), CV_8UC1);
1753 Mat photo_mask = Mat::zeros(screen.size(), CV_8UC1);
1754 for (vector<Blob>::iterator b = image_blobs.begin();
1755 b != image_blobs.end(); ++b){
1756
1757 Rect& r = *b;
1758 Mat mask;
1759 if (r.height < 100)
1760 mask = ui_mask;
1761 else
1762 mask = photo_mask;
1763
1764 Mat m(mask,
1765 Range(r.y,r.y+r.height),
1766 Range(r.x,r.x+r.width));
1767
1768 m = 255;
1769 }
1770
1771 VLOG("UIMask", ui_mask);
1772 VLOG("PhotoMask", photo_mask);
1773
1774 Mat segmap;
1775 Mat segmapr;
1776 Mat segmapg;
1777 Mat segmapb;
1778
1779 bitwise_and(dilated,text_mask,segmapr);
1780 bitwise_and(dilated,ui_mask,segmapg);
1781 bitwise_and(dilated_again,photo_mask,segmapb);
1782 //segmapb = photo_mask;
1783
1784
1785 Mat cs[3] = {segmapb, segmapg,segmapr};
1786 merge(cs,3,segmap);
1787 VLOG("SegMap", segmap);
1788
1789
1790 //Mat wordmap = screen_darken.clone();//segmap.clone();
1791 Mat wordmap = Mat::zeros(screen.size(), CV_8UC3);
1792
1793
1794 screen.copyTo(wordmap, segmapg);
1795 screen.copyTo(wordmap, photo_mask);
1796 screen.copyTo(wordmap, text_mask);
1797
1798
1799
1800 Mat random_ids = Mat::ones(1,100,CV_8UC1);
1801 randu(random_ids, 22, 80);
1802
1803 Scalar white(255,255,255);
1804 Scalar black(0,0,0);
1805 Scalar yellow(255,255,0);
1806
1807
1808 int i = 0;
1809
1810 for (vector<Blob>::iterator b = image_blobs.begin();
1811 b != image_blobs.end(); ++b){
1812
1813 Rect& r = *b;
1814
1815
1816 char vwstr[100];
1817
1818
1819 if (r.height < 100){
1820
1821 int xc = r.x + r.width/2;
1822 int yc = r.y + r.height/2;
1823
1824
1825 // putTextWithBackgroundCentered(black, wordmap, "u12", Point(xc,yc),
1826 // FONT_HERSHEY_SIMPLEX, 0.5, white);
1827
1828 int id = random_ids.at<uchar>(0,i++);
1829 sprintf(vwstr,"u%d",id);
1830
1831// putTextWithBackgroundCentered(white, wordmap, vwstr, Point(xc,yc),
1832// FONT_HERSHEY_DUPLEX, 0.5, black);
1833
1834
1835 }else{
1836
1837
1838 SURF surf_extractor(6.0e3);
1839 vector<KeyPoint> keypoints;
1840
1841 // printf("Extracting keypoints\n");
1842 surf_extractor(screen_gray, photo_mask, keypoints);
1843 //printf("Extracted %d keypoints from the image\n", (int)keypoints.size());
1844
1845 for (vector<KeyPoint>::iterator it = keypoints.begin(); it != keypoints.end(); ++it){
1846 KeyPoint& p = *it;
1847
1848 circle(wordmap, p.pt, p.size*1.5, yellow);
1849
1850 // putTextWithBackgroundCentered(black, wordmap, "v12", p.pt,
1851 // FONT_HERSHEY_SIMPLEX, 0.5, white);
1852
1853 int id = random_ids.at<uchar>(0,i++);
1854 sprintf(vwstr,"s%d",id);
1855
1856// putTextWithBackgroundCentered(white, wordmap, vwstr, p.pt,
1857// FONT_HERSHEY_DUPLEX, 0.5, black);
1858
1859 }
1860 }
1861
1862
1863 }
1864
1865 VLOG("WordMap", wordmap);
1866}
1867
1868
1869
1870
1871static int L1dist(Vec3b p1, Vec3b p2){
1872 return max(p1[0],p2[0])-min(p1[0],p2[0])+
1873 max(p1[1],p2[1])-min(p1[1],p2[1])+
1874 max(p1[2],p2[2])-min(p1[2],p2[2]);
1875}
1876
1877
1878
1879bool
1880cvgui::areHorizontallyAligned(const vector<Rect>& rects){
1881
1882 if (rects.size() <= 1)
1883 return true;
1884
1885 vector<Rect> sorted_rects = rects;
1886 sort(sorted_rects, sort_by_x);
1887
1888 int ymin = 10000;
1889 int ymax = 0;
1890
1891 bool no_overlap = true;
1892 for (vector<Rect>::const_iterator r = sorted_rects.begin() + 1;
1893 r != sorted_rects.end(); ++r){
1894
1895 no_overlap = no_overlap && (r->x >= (r-1)->x + (r-1)->width - 2);
1896
1897 int baseline = r->y + r->height;
1898 ymin = min(baseline, ymin);
1899 ymax = max(baseline, ymax);
1900 }
1901
1902 bool baseline_aligned = (ymax - ymin < 10);
1903
1904 int minv = 10000;
1905 int maxv = 0;
1906 for (vector<Rect>::const_iterator r = sorted_rects.begin();
1907 r != sorted_rects.end(); ++r){
1908
1909 int v = r->height;
1910 minv = min(v, minv);
1911 maxv = max(v, maxv);
1912 }
1913
1914 bool height_similar = (maxv - minv < 10);
1915
1916 // if the difference between the highest and lowest baseline
1917 // is too large, it means the rects are not alginged horizontally
1918
1919 return baseline_aligned && height_similar && no_overlap;
1920}
1921
1922
1923bool
1924cvgui::hasMoreThanNUniqueColors(const Mat& src, int n){
1925
1926
1927 Mat_<Vec3b>::const_iterator it = src.begin<Vec3b>(),
1928 itEnd = src.end<Vec3b>();
1929
1930
1931 vector< pair<Vec3b,int> > colors;
1932 //vector<int> counts;
1933 colors.push_back( pair<Vec3b,int>(*it,1) );
1934 ++it;
1935
1936 for(; it != itEnd; ++it){
1937
1938 bool matched;
1939 matched = false;
1940 for (vector< pair<Vec3b,int> >::iterator c = colors.begin();
1941 c != colors.end();
1942 ++c){
1943
1944 Vec3b& color = (*c).first;
1945 int& count = (*c).second;
1946
1947 int d = L1dist((*it), (color));
1948 //cout << d << endl;
1949 if (d < 150){
1950 matched = true;
1951 count++;
1952 break;
1953 }
1954 }
1955
1956 if (!matched){
1957
1958 // if (colors.size() == 4)
1959 // return true;
1960 // else
1961 colors.push_back(pair<Vec3b,int>(*it,1));
1962
1963 }
1964
1965 }
1966
1967 dout() << endl << endl;
1968 for (vector< pair<Vec3b,int> >::iterator c = colors.begin();
1969 c != colors.end();
1970 ++c){
1971
1972 Vec3b& color = (*c).first;
1973 int& count = (*c).second;
1974 //cout << count << endl;
1975 }
1976
1977 return (colors.size() > 5);
1978}
1979
1980
1981void
1982cvgui::extractSmallRects(const Mat& src,
1983 vector<Rect>& rects){
1984
1985 Mat copy = src.clone();
1986
1987 vector<vector<Point> > contours;
1988 findContours(copy, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
1989
1990 for (vector<vector<Point> >::iterator contour = contours.begin();
1991 contour != contours.end(); ++contour){
1992
1993 Rect bound = boundingRect(Mat(*contour));
1994 rects.push_back(bound);
1995 }
1996
1997}
1998
1999void
2000cvgui::calculateColor(vector<Blob>& blobs,
2001 const Mat& color_image,
2002 const Mat& foreground_mask){
2003
2004
2005 for (vector<Blob>::iterator it = blobs.begin();
2006 it != blobs.end(); ++it){
2007
2008 Blob& blob = *it;
2009
2010
2011 Mat part(color_image, blob);
2012 Mat mask(foreground_mask, blob);
2013 Scalar mean, stddev;
2014 meanStdDev(part, mean, stddev, mask);
2015
2016 blob.mr = mean[0];
2017 blob.mg = mean[1];
2018 blob.mb = mean[2];
2019
2020 }
2021
2022}
2023
2024
2025void
2026cvgui::extractBlobs(const Mat& src, vector<Blob>& blobs){
2027
2028 Mat copy = src.clone();
2029 blobs.clear();
2030
2031 vector<vector<Point> > contours;
2032 findContours(copy, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
2033
2034
2035 for (vector<vector<Point> >::iterator contour = contours.begin();
2036 contour != contours.end(); ++contour){
2037
2038
2039 double area = contourArea(Mat(*contour));
2040
2041 Rect bound = boundingRect(Mat(*contour));
2042
2043
2044
2045
2046 Blob blob(bound);
2047 blob.area = area;
2048 blobs.push_back(blob);
2049
2050 }
2051
2052
2053
2054
2055
2056}
2057
2058
2059void
2060cvgui::extractRects(const Mat& src,
2061 vector<Rect>& rects){
2062
2063 Mat copy = src.clone();
2064 rects.clear();
2065
2066
2067 vector<vector<Point> > contours;
2068 findContours(copy, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
2069
2070
2071 for (vector<vector<Point> >::iterator contour = contours.begin();
2072 contour != contours.end(); ++contour){
2073
2074
2075 double area = contourArea(Mat(*contour));
2076
2077 Rect bound = boundingRect(Mat(*contour));
2078
2079
2080 // too small
2081 if (bound.width < 6 || bound.height < 6)
2082 continue;
2083
2084 // too empty
2085 if (bound.height > 100 && bound.width * bound.height * 0.50 > area)
2086 continue;
2087
2088 rects.push_back(bound);
2089
2090 }
2091
2092}
2093
2094void
2095cvgui::findLongLines_Vertical(const Mat& src, Mat& dest, int min_length, int extension){
2096 dest = src.clone();
2097
2098 Mat maskT, destT;
2099 transpose(dest,destT);
2100 cvgui::findLongLines_Horizontal(destT,maskT,min_length, extension);
2101
2102 Mat maskTT;
2103 transpose(maskT,maskTT);
2104 dest = maskTT;
2105}
2106
2107
2108void
2109cvgui::findLongLines(const Mat& src, Mat& dest, int min_length, int extension){
2110
2111 Mat copy = src.clone();
2112 Mat v,h;
2113
2114 cvgui::findLongLines_Horizontal(copy, h, min_length, extension);
2115
2116
2117 cvgui::findLongLines_Vertical(copy, v, min_length, extension);
2118
2119// Mat maskT, destT;
2120// transpose(dest,destT);
2121// cvgui::findLongLines_Horizontal(destT,maskT,min_length, extension);
2122//
2123// Mat maskTT;
2124// transpose(maskT,maskTT);
2125
2126
2127 bitwise_or(v,h,dest);
2128
2129}
2130
2131
2132//void
2133//cvgui::filterLineSegments(const Mat& src, Mat& dest,
2134// int min_length, int max_length){
2135//
2136// typedef uchar T;
2137//
2138// int extension = 5;
2139//
2140// dest = Mat::zeros(src.rows,src.cols,CV_8UC1);
2141//
2142// Size size = src.size();
2143// for( int i = 0; i < size.height; i +=1 ){
2144//
2145// const T* ptr1 = src.ptr<T>(i);
2146// T* ptr2 = dest.ptr<T>(i);
2147//
2148// bool has_previous_baseline = false;
2149// int previous_baseline_endpoint = 0;
2150// int current_baseline_startpoint = 0;
2151//
2152//
2153// for( int j = 1; j < size.width; j += 1 ){
2154//
2155//
2156// if (ptr1[j] > 0 && ptr1[j-1] == 0){
2157// current_baseline_startpoint = j;
2158// }
2159//
2160// if (ptr1[j-1] > 0 && (ptr1[j] == 0 || j == size.width - 1)){
2161//
2162//
2163// // check for the condition of a baseline hypothesis
2164// // the length of the baseline must be > 15
2165// if ((j - current_baseline_startpoint) > min_length){// || j == size.width - 1){
2166//
2167// // int closeness_threshold = 1;
2168// // if (has_previous_baseline &&
2169// // (current_baseline_startpoint - previous_baseline_endpoint)
2170// // <= closeness_threshold){
2171// //
2172// //
2173// // // merge the current baseline with the previously baseline
2174// // for (int k=previous_baseline_endpoint;
2175// // k < current_baseline_startpoint; k += 1){
2176// // ptr2[k] = ptr1[j];
2177// // }
2178// // }
2179//
2180// // has_previous_baseline = true;
2181// //previous_baseline_endpoint = j;
2182//
2183//
2184// for (int k=current_baseline_startpoint; k < j; ++k){
2185// ptr2[k] = 255;
2186// }
2187//
2188// for (int k=j; k < min(j+extension,size.width-1); ++k){
2189// ptr2[k] = 255;
2190// }
2191//
2192//
2193// }
2194//
2195// // forming a new baseline hypothesis
2196// //current_baseline_startpoint = j+1;
2197// }
2198// }
2199// }
2200//
2201//}
2202
2203
2204void
2205cvgui::voteCenter_Vertical(const Mat& binary, Mat& dest,
2206 int min_length, int tolerance, int distance){
2207
2208 dest = binary.clone();
2209
2210 Mat maskT, destT;
2211 transpose(dest,destT);
2212 cvgui::voteCenter_Horizontal(destT,maskT,min_length,tolerance,distance);
2213
2214 Mat maskTT;
2215 transpose(maskT,maskTT);
2216 dest = maskTT;
2217}
2218
2219void
2220cvgui::voteCenter_Horizontal(const Mat& binary, Mat& dest,
2221 int min_length, int tolerance, int distance){
2222
2223 typedef uchar T;
2224
2225 dest = Mat::zeros(binary.rows,binary.cols,CV_8UC1);
2226
2227 Size size = binary.size();
2228 for( int i = 0; i < size.height; i +=1 ){
2229
2230 const T* ptr1 = binary.ptr<T>(i);
2231 T* ptr2 = 0;
2232 //dest.ptr<T>(i);
2233//
2234//
2235// T* ptru = 0;
2236// T* ptrb = 0;
2237//
2238 int grid = 5;
2239
2240
2241 int gi = grid*(i+distance)/grid;
2242
2243 if (gi >= 0 && gi < size.height){
2244 ptr2 = dest.ptr<T>(i+distance);
2245 }
2246
2247// if (grid*(i+distance)/grid<size.height){
2248// ptrb = dest.ptr<T>(i+distance);
2249// }
2250
2251 bool has_previous_baseline = false;
2252 int previous_baseline_endpoint = 0;
2253 int current_baseline_startpoint = 0;
2254
2255
2256 for( int j = 1; j < size.width; j += 1 ){
2257
2258
2259 if (ptr1[j] > 0 && ptr1[j-1] == 0){
2260 current_baseline_startpoint = j;
2261 }
2262
2263 if (ptr1[j-1] > 0 && (ptr1[j] == 0 || j == size.width - 1)){
2264
2265
2266 // check for the condition of a baseline hypothesis
2267 // the length of the baseline must be > 15
2268 if ((j - current_baseline_startpoint) > min_length){// || j == size.width - 1){
2269
2270
2271
2272 for (int k=current_baseline_startpoint+min_length/2; k < j-min_length/2; ++k){
2273
2274 if (ptr2)
2275 ptr2[k] = 255;
2276 }
2277
2278 for (int k=j-min_length/2; k < min(j-min_length/2+tolerance,size.width-1); ++k){
2279
2280 if (ptr2)
2281 ptr2[k] = 255;
2282
2283 }
2284
2285
2286 }
2287
2288 // forming a new baseline hypothesis
2289 //current_baseline_startpoint = j+1;
2290 }
2291 }
2292 }
2293
2294}
2295
2296void
2297cvgui::findLongLines_Horizontal(const Mat& binary, Mat& dest,
2298 int min_length, int extension){
2299
2300 typedef uchar T;
2301
2302 dest = Mat::zeros(binary.rows,binary.cols,CV_8UC1);
2303
2304 Size size = binary.size();
2305 for( int i = 0; i < size.height; i +=1 ){
2306
2307 const T* ptr1 = binary.ptr<T>(i);
2308 T* ptr2 = dest.ptr<T>(i);
2309
2310 bool has_previous_baseline = false;
2311 int previous_baseline_endpoint = 0;
2312 int current_baseline_startpoint = 0;
2313
2314
2315
2316
2317 for( int j = 1; j < size.width; j += 1 ){
2318
2319
2320 if (ptr1[j] > 0 && ptr1[j-1] == 0){
2321 current_baseline_startpoint = j;
2322 }
2323
2324 if (ptr1[j-1] > 0 && (ptr1[j] == 0 || j == size.width - 1)){
2325
2326
2327 // check for the condition of a baseline hypothesis
2328 // the length of the baseline must be > 15
2329 if ((j - current_baseline_startpoint) > min_length){// || j == size.width - 1){
2330
2331 // int closeness_threshold = 1;
2332 // if (has_previous_baseline &&
2333 // (current_baseline_startpoint - previous_baseline_endpoint)
2334 // <= closeness_threshold){
2335 //
2336 //
2337 // // merge the current baseline with the previously baseline
2338 // for (int k=previous_baseline_endpoint;
2339 // k < current_baseline_startpoint; k += 1){
2340 // ptr2[k] = ptr1[j];
2341 // }
2342 // }
2343
2344 // has_previous_baseline = true;
2345 //previous_baseline_endpoint = j;
2346
2347
2348 for (int k=current_baseline_startpoint; k < j; ++k){
2349 ptr2[k] = 255;
2350 }
2351
2352 for (int k=j; k < min(j+extension,size.width-1); ++k){
2353 ptr2[k] = 255;
2354 }
2355
2356
2357 }
2358
2359 // forming a new baseline hypothesis
2360 //current_baseline_startpoint = j+1;
2361 }
2362 }
2363 }
2364}
2365
2366
2367Mat
2368cvgui::obtainGrayBackgroundMask(const Mat& input){
2369
2370 Mat copy = input.clone();
2371
2372 Mat_<Vec3b>::iterator it = copy.begin<Vec3b>(),
2373 itEnd = copy.end<Vec3b>();
2374 for(; it != itEnd; ++it){
2375
2376 uchar& b = (*it)[0];
2377 uchar& g = (*it)[1];
2378 uchar& r = (*it)[2];
2379
2380 if (r == 0 && b == 0 && g == 0){
2381 r = 1; b = 1; g = 1;
2382 }
2383
2384 if (b > 50 &&
2385 abs(b-g) < 10 && abs(g-b) < 10 && abs(b-r) < 10){
2386 r = 0;
2387 g = 0;
2388 b = 0;
2389 }
2390
2391
2392
2393 }
2394
2395
2396 Mat ms[3];
2397 split(copy, ms);
2398
2399 Mat mask;
2400 threshold(ms[0],mask,0,255,THRESH_BINARY);
2401
2402 dilate(mask,mask,Mat());
2403
2404 return mask;
2405}
2406
2407
2408Mat
2409cvgui::removeGrayBackground(const Mat& input){
2410
2411// Mat copy = input.clone();
2412// Mat mask;
2413// // (Size(copy.rows,copy.cols), CV_8UC1);
2414//
2415// Mat_<Vec3b>::iterator it = copy.begin<Vec3b>(),
2416// itEnd = copy.end<Vec3b>();
2417// for(; it != itEnd; ++it){
2418//
2419// uchar& b = (*it)[0];
2420// uchar& g = (*it)[1];
2421// uchar& r = (*it)[2];
2422//
2423// if (r == 0 && b == 0 && g == 0){
2424// r = 1; b = 1; g = 1;
2425// }
2426//
2427// if (b > 50 &&
2428// abs(b-g) < 10 && abs(g-b) < 10 && abs(b-r) < 10){
2429// r = 0;
2430// g = 0;
2431// b = 0;
2432// }
2433//
2434//
2435//
2436// }
2437//
2438//
2439// Mat ms[3];
2440// split(copy, ms);
2441//
2442// //threshold(ms[0],mask,0,255,THRESH_BINARY_INV);
2443// threshold(ms[0],mask,0,255,THRESH_BINARY);
2444//
2445// dilate(mask,mask,Mat());
2446//
2447//
2448// vector<vector<Point> > contours;
2449// findContours(ms[0], contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
2450//
2451// Scalar red(0,0,255);
2452// //drawContours(copy, contours, -1, red);
2453//
2454//
2455// vector<Rect> boundingRects;
2456//
2457// for (vector<vector<Point> >::iterator contour = contours.begin();
2458// contour != contours.end(); ++contour){
2459//
2460//
2461// double area = contourArea(Mat(*contour));
2462//
2463// Rect bound = boundingRect(Mat(*contour));
2464//
2465//
2466// if (bound.width * bound.height * 0.5 > area)
2467// continue;
2468//
2469// boundingRects.push_back(bound);
2470//
2471// rectangle(copy,
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: