From 335370a7c03a6c7b209c064db9fe6293da886fc8 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Sun, 17 Apr 2011 13:09:04 +0000 Subject: [PATCH] moved Python bindings source code into src subdirectory; preparing to add python/doc and python/test subdirectories --- modules/python/CMakeLists.txt | 24 ++++++------ modules/python/hdr_parser.pyc | Bin 0 -> 17332 bytes modules/python/{ => src}/api | 0 modules/python/{ => src}/cv.cpp | 4 +- modules/python/{ => src}/defs | 0 modules/python/{ => src}/gen.py | 0 modules/python/{ => src}/gen2.py | 0 modules/python/{ => src}/hdr_parser.py | 36 +++++++++++++----- modules/python/src/hdr_parser.pyc | Bin 0 -> 17939 bytes modules/python/{ => src}/opencv2x.h | 0 modules/python/{ => src}/opencv_extra_api.hpp | 0 11 files changed, 40 insertions(+), 24 deletions(-) create mode 100755 modules/python/hdr_parser.pyc rename modules/python/{ => src}/api (100%) rename modules/python/{ => src}/cv.cpp (99%) rename modules/python/{ => src}/defs (100%) rename modules/python/{ => src}/gen.py (100%) rename modules/python/{ => src}/gen2.py (100%) rename modules/python/{ => src}/hdr_parser.py (94%) create mode 100755 modules/python/src/hdr_parser.pyc rename modules/python/{ => src}/opencv2x.h (100%) rename modules/python/{ => src}/opencv_extra_api.hpp (100%) diff --git a/modules/python/CMakeLists.txt b/modules/python/CMakeLists.txt index b537123dc2..91246563e3 100644 --- a/modules/python/CMakeLists.txt +++ b/modules/python/CMakeLists.txt @@ -5,7 +5,7 @@ project(opencv_python) include_directories(${PYTHON_INCLUDE_PATH}) include_directories( - ${CMAKE_CURRENT_SOURCE_DIR} + "${CMAKE_CURRENT_SOURCE_DIR}/src" "${CMAKE_SOURCE_DIR}/modules/core/include" "${CMAKE_SOURCE_DIR}/modules/imgproc/include" "${CMAKE_SOURCE_DIR}/modules/video/include" @@ -30,7 +30,7 @@ set(opencv_hdrs "${CMAKE_SOURCE_DIR}/modules/core/include/opencv2/core/core.hpp" "${CMAKE_SOURCE_DIR}/modules/features2d/include/opencv2/features2d/features2d.hpp" "${CMAKE_SOURCE_DIR}/modules/calib3d/include/opencv2/calib3d/calib3d.hpp" "${CMAKE_SOURCE_DIR}/modules/objdetect/include/opencv2/objdetect/objdetect.hpp" - "${CMAKE_SOURCE_DIR}/modules/python/opencv_extra_api.hpp") + "${CMAKE_SOURCE_DIR}/modules/python/src/opencv_extra_api.hpp") set(generated_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_funcs.h" @@ -43,27 +43,27 @@ if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3") endif() -file(GLOB lib_srcs "*.cpp") -file(GLOB lib_hdrs "*.h") +file(GLOB lib_srcs "src/*.cpp") +file(GLOB lib_hdrs "src/*.h") add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated0.i - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/gen.py ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/api - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/defs - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/gen.py + COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src/gen.py" "${CMAKE_CURRENT_SOURCE_DIR}/src" + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/api + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/defs + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/gen.py ) add_custom_command( OUTPUT ${generated_hdrs} - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/gen2.py ${CMAKE_CURRENT_BINARY_DIR} ${opencv_hdrs} - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/gen2.py - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/hdr_parser.py + COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src/gen2.py" ${CMAKE_CURRENT_BINARY_DIR} ${opencv_hdrs} + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/gen2.py + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/hdr_parser.py DEPENDS ${opencv_hdrs} ) set(the_target "opencv_python") -add_library(${the_target} ${lib_srcs} ${lib_hdrs} ${lib_int_hdrs} ${CMAKE_CURRENT_BINARY_DIR}/generated0.i opencv2x.h opencv_extra_api.hpp ${generated_hdrs}) +add_library(${the_target} ${lib_srcs} ${lib_hdrs} ${lib_int_hdrs} ${CMAKE_CURRENT_BINARY_DIR}/generated0.i src/opencv2x.h src/opencv_extra_api.hpp ${generated_hdrs}) target_link_libraries(${the_target} ${PYTHON_LIBRARIES} opencv_core opencv_imgproc opencv_video opencv_ml opencv_features2d opencv_highgui opencv_calib3d opencv_objdetect opencv_legacy opencv_contrib) set_target_properties(${the_target} PROPERTIES PREFIX "") diff --git a/modules/python/hdr_parser.pyc b/modules/python/hdr_parser.pyc new file mode 100755 index 0000000000000000000000000000000000000000..b3e9a5d6510907e68fb89a091b778a5540be51a3 GIT binary patch literal 17332 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 0: a = a[:eqpos].strip() arg_type, arg_name, modlist, argno = self.parse_arg(a, argno) + if arg_type == "InputArray" or arg_type == "InputOutputArray": + arg_type = "Mat" + elif arg_type == "OutputArray": + arg_type = "Mat" + modlist.append("/O") + elif arg_type == "InputArrayOfArrays" or arg_type == "InputOutputArrayOfArrays": + arg_type = "vector_Mat" + elif arg_type == "OutputArrayOfArrays": + arg_type = "vector_Mat" + modlist.append("/O") + defval = self.batch_replace(defval, [("InputArrayOfArrays", "vector"), + ("InputOutputArrayOfArrays", "vector"), + ("OutputArrayOfArrays", "vector"), + ("InputArray", "Mat"), + ("InputOutputArray", "Mat"), + ("OutputArray", "Mat")]).strip() args.append([arg_type, arg_name, defval, modlist]) npos = arg_start-1 diff --git a/modules/python/src/hdr_parser.pyc b/modules/python/src/hdr_parser.pyc new file mode 100755 index 0000000000000000000000000000000000000000..cc852e4137f1961bbf6c1cc1a12009d2c018b92a GIT binary patch literal 17939 zcmcIsTW}oNSw20ZyLGW-*|Kb}-Imv@kyk6Ny_}znntRXL8gJA0l`5Ai;mT|NGo_mG$zPS4N!wZt zO7T`Bh%P)^uq7#bRPm{__;%*3n^+E(~X$!2`=SEYv0qFu^ju!B()OZAWmF(qKG zUVk?z`9Wi`)QEycD(N|-y^Y`K5rP0xC%J}rQm7ruDJ3_j2S|5b50LRTJwSHb^#FPA z&;z8tQxA~+EEiDz_xq0P!+|P(RZ{NHzS6sR_cl*Y|yo$`-yn-B8ug%>ou%(#w zM?qzkyUZwvD6rFaFyGPic76I$t?_WWR^CoF-1J7x->L-Bbp3I>UaL+=jq>!m-ze6# zLQ{zCLh)iTtcG#1cmmH6J8qorGH!|P18fTy z%20v>p@0THa{b*nN3nnqQEy6Fwwv8{v-4F76J!N7qB=KEO@ zI--IRbn0}d^8!z+Ijkk8XKJX zf%w=x>+6Kjj!^{@5tU_Dc7tmIrRa`NjJsjAr8M+&#a5xMr(LibR(%OdC9DS3T1+{O z9!E+GcEVU1iJ6L3XsTjddx&mvJ)^i0)(c!+D|~!Hw~L5Z;cC5RWswgTRD@5j#mu-; zs+6kbK>d%OuSl*1aZ!_1L~mHNPDcZA>~jX3L8rsXJ7<&UKBpf~J^1a-NmvgfKjm7& z`imImn&G~rutF$0OzjL-KF=MBC8sn}n632XlkF<`luYi;kLAzuOFi4|&HNDXWb31? z4rWZ`s?$7ZH?_cL*GMgW7UU35P`6E_E4*=t$BGvbf9%b>D49PK`j5NQlv4 zG}7~9H*(;IYy`u=++l7y&2E?G5l2g}_U%7u&va{JaR*}n$k#`33*yny1Fk=UhI`GXmtz9Df6=~G z7aWI^aZtsNtC)XOsZaVfEuD6x<2K(A^VR#14}}I*=#TNzZ|YRQqtcSyO$FRT;EKVd zQ-wEGP@|T_n2*_R{7=56y3eUPtp6x}sUKPK@gGnz=8Ofp&4V`6to(#3=fq<>qKD|n z#3q`mzONQ)C)I~!Dr|Z=r%Ep7XR8;LT05&h{tMm+As7YX+DlzDPU(!%Wy z$sFbYn}?D617@SISs2BdGCydZV0+{>qdn-tY4%N0*=Fio_f#1SnwAZq9IDU7P^nLb zY^gp|r{wjT5IgV?JI~#L1`w5lY$5k%q22Mv4A2$NYzG2}iU8{HA?k*(0HX0R7!E+vyyN%1a@=_(N=lgEk*8FZ7Z&C#pzK# zHtCM7BfbpV12_z?Q&UqDX+x!|¶lcuV{Bb?rTu*3FBRs7Vdk2h*t8il~YR9g7< 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