Skip to content

Commit c3de0d3

Browse files
authored
Merge pull request #3009 from archit120:julia_21-phase2
[GSoC] Julia - phase 2 * Use 64bit types by default for int and float * Type promotion julia * Fix DNN test * Remote whitespace
1 parent 9278ed8 commit c3de0d3

File tree

8 files changed

+109
-71
lines changed

8 files changed

+109
-71
lines changed

modules/julia/gen/cpp_files/jlcv.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ typedef flann::SearchParams flann_SearchParams;
7373
#include <opencv2/dnn.hpp>
7474
typedef cv::dnn::DictValue LayerId;
7575
typedef cv::dnn::Backend dnn_Backend;
76+
typedef cv::dnn::Target dnn_Target;
7677
#endif
7778

7879
#ifdef HAVE_OPENCV_CALIB3D
@@ -104,7 +105,7 @@ struct force_enum<T, false>{
104105
};
105106
template<typename T>
106107
struct force_enum<T, true>{
107-
using Type = int;
108+
using Type = int64_t;
108109
};
109110

110111
template<typename T>

modules/julia/gen/defval.txt

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,103 @@
11
Float64|0.1|0.1
22
Float64|1.0|1.0
33
Float64|0|0
4-
Int32|NORM_L2|cv_NORM_L2
4+
Int64|NORM_L2|cv_NORM_L2
55
Float64|0.04|0.04
66
Bool|true|true
7-
Float32|0.0f|0
7+
Float64|0.0f|0
88
Float64|DBL_MAX|typemax(Float64)
99
Ptr{Float32}|Ptr<float>()|cpp_to_julia(PtrifloatkOP())
10-
Int32|CV_32F|CV_32F
11-
Int32|20|20
10+
Int64|CV_32F|CV_32F
11+
Int64|20|20
1212
Array{String, 1}|std::vector<String>()|cpp_to_julia(stdggvectoriStringkOP())
13-
Float32|1|1
13+
Float64|1|1
1414
TermCriteria|TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1)|cpp_to_julia(TermCriteriaOTermCriteriaggMAXRITERRTermCriteriaggEPSSbSXP())
15-
Int32|4|4
16-
Int32|LINE_8|cv_LINE_8
17-
Float32|0.5|0.5
18-
Float32|0.5f|0.5
19-
Int32|MARKER_CROSS|cv_MARKER_CROSS
15+
Int64|4|4
16+
Int64|LINE_8|cv_LINE_8
17+
Float64|0.5|0.5
18+
Float64|0.5f|0.5
19+
Int64|MARKER_CROSS|cv_MARKER_CROSS
2020
Float64|1|1
2121
Point{Int32}|Point(-1,-1)|cpp_to_julia(PointOTXSTXP())
2222
Float64|CV_PI*0.5|pi*0.5
23-
Int32|QT_FONT_NORMAL|cv_QT_FONT_NORMAL
23+
Int64|QT_FONT_NORMAL|cv_QT_FONT_NORMAL
2424
Point{Int32}|Point()|cpp_to_julia(PointOP())
2525
Float64|CV_PI|pi
26-
Float32|-1|-1
27-
Int32|300|300
28-
Int32|3|3
26+
Float64|-1|-1
27+
Int64|300|300
28+
Int64|3|3
2929
String|""|""
3030
Scalar|Scalar()|cpp_to_julia(ScalarOP())
31-
Float32|1.f|1
31+
Float64|1.f|1
3232
Array{Int32, 1}|std::vector<int>()|cpp_to_julia(stdggvectoriintkOP())
3333
InputArray|Mat()|CxxMat()
34-
Int32|BORDER_DEFAULT|cv_BORDER_DEFAULT
35-
Int32|CV_32S|CV_32S
36-
Int32|IMREAD_COLOR|cv_IMREAD_COLOR
34+
Int64|BORDER_DEFAULT|cv_BORDER_DEFAULT
35+
Int64|CV_32S|CV_32S
36+
Int64|IMREAD_COLOR|cv_IMREAD_COLOR
3737
Float64|100|100
3838
Size{Int32}|Size(8, 8)|cpp_to_julia(SizeOeSGeP())
3939
Array{InputArray, 1}||Array{InputArray, 1}()
40-
Int32|GC_EVAL|cv_GC_EVAL
41-
Int32|8|8
42-
Int32|DIST_LABEL_CCOMP|cv_DIST_LABEL_CCOMP
43-
Int32|CAP_ANY|cv_CAP_ANY
44-
Float32|0|0
45-
Int32|-1|-1
40+
Int64|GC_EVAL|cv_GC_EVAL
41+
Int64|8|8
42+
Int64|DIST_LABEL_CCOMP|cv_DIST_LABEL_CCOMP
43+
Int64|CAP_ANY|cv_CAP_ANY
44+
Float64|0|0
45+
Int64|-1|-1
4646
Float64|-DBL_MAX|-typemax(Float64)
4747
Scalar|Scalar::all(0)|cpp_to_julia(ScalarggallOWP())
4848
InputArray||CxxMat()
49-
Int32|QT_STYLE_NORMAL|cv_QT_STYLE_NORMAL
50-
Int32|INTER_LINEAR|cv_INTER_LINEAR
49+
Int64|QT_STYLE_NORMAL|cv_QT_STYLE_NORMAL
50+
Int64|INTER_LINEAR|cv_INTER_LINEAR
5151
Bool|false|false
52-
Int32|CV_64F|CV_64F
52+
Int64|CV_64F|CV_64F
5353
Point{Int32}|Point(-1, -1)|cpp_to_julia(PointOTXSGTXP())
5454
Scalar|morphologyDefaultBorderValue()|cpp_to_julia(morphologyDefaultBorderValueOP())
55-
Int32|IMREAD_ANYCOLOR|cv_IMREAD_ANYCOLOR
56-
Int32|INT_MAX|typemax(Int32)
55+
Int64|IMREAD_ANYCOLOR|cv_IMREAD_ANYCOLOR
56+
Int64|INT_MAX|typemax(Int32)
5757
String|String()|""
5858
Float64|1.|1
59-
Int32|WINDOW_AUTOSIZE|cv_WINDOW_AUTOSIZE
60-
Int32|DECOMP_LU|cv_DECOMP_LU
59+
Int64|WINDOW_AUTOSIZE|cv_WINDOW_AUTOSIZE
60+
Int64|DECOMP_LU|cv_DECOMP_LU
6161
Float64|40.0|40.0
62-
Int32|BORDER_CONSTANT|cv_BORDER_CONSTANT
62+
Int64|BORDER_CONSTANT|cv_BORDER_CONSTANT
6363
Array{UInt8, 1}|std::vector<uchar>()|cpp_to_julia(stdggvectoriucharkOP())
64-
Int32|0|0
64+
Int64|0|0
6565
Float64|255.|255
6666
Scalar|Scalar(1)|cpp_to_julia(ScalarOXP())
67-
Int32|1|1
67+
Int64|1|1
6868
Size{Int32}|Size()|cpp_to_julia(SizeOP())
6969
TermCriteria|TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 20, FLT_EPSILON)|cpp_to_julia(TermCriteriaOTermCriteriaggEPSGRGTermCriteriaggCOUNTSGYWSGFLTREPSILONP())
70-
Int32|RANSAC|cv_RANSAC
71-
Float32|8.0|8.0
70+
Int64|RANSAC|cv_RANSAC
71+
Float64|8.0|8.0
7272
Float64|-1|-1
73-
Int32|21|21
73+
Int64|21|21
7474
TermCriteria|TermCriteria( TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON)|TermCriteriaOGTermCriteriaggCOUNTGRGTermCriteriaggEPSSGZWSGDBLREPSILONP
7575
TermCriteria|TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6)|TermCriteriaOTermCriteriaggCOUNTRTermCriteriaggEPSSGZWSGXeTcP
76-
Int32|CALIB_CB_SYMMETRIC_GRID|cv_CALIB_CB_SYMMETRIC_GRID
76+
Int64|CALIB_CB_SYMMETRIC_GRID|cv_CALIB_CB_SYMMETRIC_GRID
7777
InputArray|cv::Mat()|CxxMat()
78-
Int32|SOLVEPNP_ITERATIVE|cv_SOLVEPNP_ITERATIVE
78+
Int64|SOLVEPNP_ITERATIVE|cv_SOLVEPNP_ITERATIVE
7979
Float64|3|3
80-
Int32|CALIB_FIX_INTRINSIC|cv_CALIB_FIX_INTRINSIC
80+
Int64|CALIB_FIX_INTRINSIC|cv_CALIB_FIX_INTRINSIC
8181
Float64|5|5
8282
Float64|0.99|0.99
83-
Int32|CALIB_ZERO_DISPARITY|cv_CALIB_ZERO_DISPARITY
83+
Int64|CALIB_ZERO_DISPARITY|cv_CALIB_ZERO_DISPARITY
8484
size_t|2000|2000
8585
SolvePnPMethod|SOLVEPNP_ITERATIVE|cv_SOLVEPNP_ITERATIVE
8686
Float64|0.0|0.0
8787
Ptr{Feature2D}|SimpleBlobDetector::create()|SimpleBlobDetectorggcreateOP
88-
Int32|StereoSGBM::MODE_SGBM|StereoSGBMggMODERSGBM
89-
Int32|CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE|cv_CALIB_CB_ADAPTIVE_THRESH + cv_CALIB_CB_NORMALIZE_IMAGE
88+
Int64|StereoSGBM::MODE_SGBM|StereoSGBMggMODERSGBM
89+
Int64|CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE|cv_CALIB_CB_ADAPTIVE_THRESH + cv_CALIB_CB_NORMALIZE_IMAGE
9090
Float64|3.|3
9191
size_t|10|10
92-
Int32|16|16
92+
Int64|16|16
9393
Point{Float64}|Point2d(0, 0)|PointYdOWSGWP
94-
Int32|2000|2000
95-
Int32|FM_RANSAC|cv_FM_RANSAC
96-
Int32|100|100
94+
Int64|2000|2000
95+
Int64|FM_RANSAC|cv_FM_RANSAC
96+
Int64|100|100
9797
TermCriteria|TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 100, DBL_EPSILON)|TermCriteriaOTermCriteriaggCOUNTGRGTermCriteriaggEPSSGXWWSGDBLREPSILONP
9898
HandEyeCalibrationMethod|CALIB_HAND_EYE_TSAI|cv_CALIB_HAND_EYE_TSAI
99-
Float32|0.8F|0.8
100-
Int32|fisheye::CALIB_FIX_INTRINSIC|cv_fisheye_CALIB_FIX_INTRINSIC
99+
Float64|0.8F|0.8
100+
Int64|fisheye::CALIB_FIX_INTRINSIC|cv_fisheye_CALIB_FIX_INTRINSIC
101101
Float64|0.999|0.999
102-
Float64|0.995|0.995
102+
Float64|0.995|0.995
103+
Int64|1000|1000

modules/julia/gen/funclist.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ cv.dnn.Model.setInputScale
315315
cv.dnn.Model.setInputCrop
316316
cv.dnn.Model.setInputSwapRB
317317
cv.dnn.Model.setInputParams
318+
cv.dnn.Model.setPreferableTarget
318319
cv.dnn.Model.predict
319320
cv.dnn.ClassificationModel.ClassificationModel
320321
cv.dnn.ClassificationModel.classify

modules/julia/gen/gen3_cpp.py

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,23 @@ def get_setters(self):
122122
class FuncVariant(FuncVariant):
123123

124124
def get_return(self):
125+
outstr = ""
126+
for arg in self.inlist+self.optlist:
127+
if arg.tp not in pass_by_val_types and arg.tp not in enums and self.promote_type(arg.tp)!=arg.tp:
128+
outstr = outstr + "%s=%s_down;\n"%(arg.name, arg.name)
129+
125130
if len(self.outlist)==0:
126-
return ";"
131+
return outstr+";"
127132
elif len(self.outlist)==1:
128-
return "return %s;" % ( ('(int)' if self.outlist[0].tp in enums else '') + self.outlist[0].name)
129-
return "return make_tuple(%s);" % ",".join(["move(%s)" % (('(int)' if x.tp in enums else '') +x.name) for x in self.outlist])
133+
return outstr+"return %s;" % ( ('(int64_t)' if self.outlist[0].tp in enums else ('' if self.promote_type(self.outlist[0].tp)==self.outlist[0].tp else '(%s)'%self.promote_type(self.outlist[0].tp))) + self.outlist[0].name)
134+
return outstr+"return make_tuple(%s);" % ",".join(["move(%s)" % (('(int64_t)' if x.tp in enums else ('' if self.promote_type(x.tp)==x.tp else '(%s)'%self.promote_type(x.tp))) +x.name) for x in self.outlist])
135+
136+
def promote_type(self, tp):
137+
if tp=='int':
138+
return 'long long'
139+
elif tp =='float':
140+
return 'double'
141+
return tp
130142

131143
def get_argument(self, isalgo):
132144
args = self.inlist + self.optlist
@@ -142,13 +154,13 @@ def get_argument(self, isalgo):
142154
print("PATHWAY NOT TESTED")
143155
argnamelist.append(arg.tp[:-1] +"& "+arg.name)
144156
elif arg.tp in enums:
145-
argnamelist.append("int& " + arg.name)
157+
argnamelist.append("int64_t& " + arg.name)
146158
else:
147159
if arg.tp=='bool':
148160
# Bool pass-by-reference is broken
149161
argnamelist.append(arg.tp+" " +arg.name)
150162
else:
151-
argnamelist.append(arg.tp + "& "+arg.name)
163+
argnamelist.append(self.promote_type(arg.tp) + "& "+arg.name)
152164
# argnamelist = [(arg.tp if arg.tp not in pass_by_val_types else arg.tp[:-1]) +"& "+arg.name for arg in args]
153165
argstr = ", ".join(argnamelist)
154166
return argstr
@@ -157,6 +169,10 @@ def get_def_outtypes(self):
157169
outstr = ""
158170
for arg in self.deflist:
159171
outstr = outstr + "%s %s;"%(arg.tp if arg.tp not in pass_by_val_types else arg.tp[:-1], arg.name)
172+
for arg in self.inlist+self.optlist:
173+
if arg.tp not in pass_by_val_types and arg.tp not in enums and self.promote_type(arg.tp)!=arg.tp:
174+
outstr = outstr + "%s %s_down=(%s)%s;"%(arg.tp if arg.tp not in pass_by_val_types else arg.tp[:-1], arg.name, arg.tp, arg.name)
175+
160176
return outstr
161177

162178
def get_retval(self, isalgo):
@@ -171,7 +187,15 @@ def get_retval(self, isalgo):
171187
elif x.tp in enums:
172188
arlist.append("(%s)%s" %(x.tp, x.name))
173189
else:
174-
arlist.append(x.name)
190+
if self.promote_type(x.tp) == x.tp:
191+
arlist.append(x.name)
192+
else:
193+
if len([y for y in self.inlist+self.optlist if y.name==x.name])>0:
194+
# print("ss")
195+
arlist.append("%s_down" %(x.name))
196+
else:
197+
arlist.append(x.name)
198+
175199
argstr = ", ".join(arlist)
176200
if self.classname and not self.isstatic:
177201
stra = stra + "cobj%s%s(%s); " %("->" if isalgo else ".",self.name.split('::')[-1], argstr)
@@ -189,8 +213,11 @@ def get_cons_code(self, name, mapped_name):
189213
elif x.tp in enums:
190214
arglist.append("(%s)%s" %(x.tp, x.name))
191215
else:
192-
arglist.append(x.name)
193-
216+
if self.promote_type(x.tp) == x.tp:
217+
arglist.append(x.name)
218+
else:
219+
# print("ss")
220+
arglist.append("%s_down" %(x.name))
194221
return 'mod.method("%s", [](%s) { %s return jlcxx::create<%s>(%s);});' % (self.get_wrapper_name(), self.get_argument(False), self.get_def_outtypes(), name, " ,".join(arglist))
195222

196223
def get_complete_code(self, classname, isalgo=False):
@@ -255,13 +282,13 @@ def sort_classes(classes):
255282
# cpp_code.write('\n mod.add_bits<{0}>("{1}", jlcxx::julia_type("CppEnum"));'.format(e2[0], e2[1]))
256283
enums.append(e2[0])
257284
enums.append(e2[1])
258-
enums.append(e2[0].replace("cv::", ""))
285+
enums.append(e2[0].replace("cv::", "").replace("::", '_'))
259286

260287

261288
for tp in ns.register_types:
262289
cpp_code.write(' mod.add_type<%s>("%s");\n' %(tp, normalize_class_name(tp)))
263290

264-
291+
# print(enums)
265292
for name, ns in namespaces.items():
266293

267294
nsname = name.replace("::", "_")

modules/julia/gen/gen3_julia_cxx.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,25 +104,32 @@ def overload_set(self):
104104

105105
class FuncVariant(FuncVariant):
106106

107+
def promote_type(self, tp):
108+
if tp=='int':
109+
return 'long long'
110+
elif tp =='float':
111+
return 'double'
112+
return tp
113+
107114

108115
def get_argument_full(self, classname='', isalgo = False):
109116
arglist = self.inlist + self.optlist
110117

111-
argnamelist = [arg.name+"::"+(handle_jl_arg(arg.tp) if handle_jl_arg(arg.tp) not in pass_by_val_types else handle_jl_arg(arg.tp)[:-1]) for arg in arglist]
118+
argnamelist = [arg.name+"::"+(handle_jl_arg(self.promote_type(arg.tp)) if handle_jl_arg(arg.tp) not in pass_by_val_types else handle_jl_arg(self.promote_type(arg.tp[:-1]))) for arg in arglist]
112119
argstr = ", ".join(argnamelist)
113120
return argstr
114121

115122
def get_argument_opt(self, ns=''):
116123
# [print(arg.default_value,":",handle_def_arg(arg.default_value, handle_jl_arg(arg.tp))) for arg in self.optlist]
117124
try:
118-
str2 = ", ".join(["%s::%s = %s(%s)" % (arg.name, handle_jl_arg(arg.tp), handle_jl_arg(arg.tp) if (arg.tp == 'int' or arg.tp=='float' or arg.tp=='double') else '', handle_def_arg(arg.default_value, handle_jl_arg(arg.tp), ns)) for arg in self.optlist])
125+
str2 = ", ".join(["%s::%s = %s(%s)" % (arg.name, handle_jl_arg(self.promote_type(arg.tp)), handle_jl_arg(self.promote_type(arg.tp)) if (arg.tp == 'int' or arg.tp=='float' or arg.tp=='double') else '', handle_def_arg(arg.default_value, handle_jl_arg(self.promote_type(arg.tp)), ns)) for arg in self.optlist])
119126
return str2
120127
except KeyError:
121128
return ''
122129

123130
def get_argument_def(self, classname, isalgo):
124131
arglist = self.inlist
125-
argnamelist = [arg.name+"::"+(handle_jl_arg(arg.tp) if handle_jl_arg(arg.tp) not in pass_by_val_types else handle_jl_arg(arg.tp)[:-1]) for arg in arglist]
132+
argnamelist = [arg.name+"::"+(handle_jl_arg(self.promote_type(arg.tp)) if handle_jl_arg(self.promote_type(arg.tp)) not in pass_by_val_types else handle_jl_arg(self.promote_type(arg.tp[:-1]))) for arg in arglist]
126133
argstr = ", ".join(argnamelist)
127134
return argstr
128135

@@ -170,7 +177,7 @@ def gen(srcfiles):
170177
nsname = name
171178
for e1,e2 in ns.enums.items():
172179
# jl_code.write('\n const {0} = Int32'.format(e2[0]))
173-
jl_code.write('\n const {0} = Int32 \n'.format(e2[1]))
180+
jl_code.write('\n const {0} = Int64 \n'.format(e2[0].replace("cv::", "").replace("::", "_")))
174181

175182
# Do not duplicate functions. This should prevent overwriting of Mat function by UMat functions
176183
function_signatures = []

modules/julia/gen/jl_cxx_files/types_conversion.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ function julia_to_cpp(var::Array{Vec{T, N}, 1}) where {T, N}
4040
return ret
4141
end
4242

43-
function julia_to_cpp(var::Array{T}) where {T}
43+
function julia_to_cpp(var::Array{T, 1}) where {T}
4444
if size(var, 1) == 0
4545
return CxxWrap.StdVector{T}()
4646
end
@@ -69,7 +69,7 @@ end
6969

7070
function cpp_to_julia(var::CxxWrap.StdVector{T}) where {T}
7171
if size(var, 1) == 0
72-
return Array{T}()
72+
return Array{T, 1}()
7373
end
7474
ret = Array{typeof(cpp_to_julia(var[1])), 1}()
7575
for x in var

modules/julia/gen/typemap.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Mat:InputArray
2929
KeyPoint:KeyPoint
3030
Moments:Moments
3131
RNG*:NONCONVERT4
32-
int:Int32
32+
int:Int64
3333
vector<float>:Array{Float32, 1}
3434
vector<Rect>:Array{Rect{Int32}, 1}
3535
Scalar:Scalar
@@ -42,11 +42,12 @@ vector<string>:Array{String, 1}
4242
vector<Point2f>:Array{Point{Float32}, 1}
4343
Size:Size{Int32}
4444
vector<MatShape>:Array{Array{Int32, 1}, 1}
45-
float:Float32
45+
float:Float64
4646
Ptr<float>:Ptr{Float32}
4747
vector<Vec6f>:Array{Vec{Float32, 6}, 1}
4848
Ptr<FeatureDetector>:Ptr{Feature2D}
4949
Point2d:Point{Float64}
5050
SolvePnPMethod:SolvePnPMethod
5151
CirclesGridFinderParameters:CirclesGridFinderParameters
5252
HandEyeCalibrationMethod:HandEyeCalibrationMethod
53+
long long:Int64

modules/julia/test/test_dnn.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ end
1212

1313
const cv = OpenCV
1414
net = cv.dnn.DetectionModel(joinpath(ENV["OPENCV_TEST_DATA_PATH"], "dnn", "opencv_face_detector.pbtxt"),joinpath(ENV["OPENCV_TEST_DATA_PATH"], "dnn", "opencv_face_detector_uint8.pb"))
15-
size0 = Int32(300)
15+
size0 = 300
1616

1717
cv.dnn.setPreferableTarget(net, cv.dnn.DNN_TARGET_CPU)
1818
cv.dnn.setInputMean(net, (104, 177, 123))
@@ -22,7 +22,7 @@ cv.dnn.setInputSize(net, size0, size0)
2222

2323
img = OpenCV.imread(joinpath(test_dir, "cascadeandhog", "images", "mona-lisa.png"))
2424

25-
classIds, confidences, boxes = cv.dnn.detect(net, img, confThreshold=Float32(0.5))
25+
classIds, confidences, boxes = cv.dnn.detect(net, img, confThreshold=0.5)
2626

2727
box = (boxes[1].x, boxes[1].y, boxes[1].x+boxes[1].width, boxes[1].y+boxes[1].height)
2828
expected_rect = (185,101,129+185,169+101)

0 commit comments

Comments
 (0)