From d3ac1bc314136d0654fad24a9ee5b01c29e9f5af Mon Sep 17 00:00:00 2001
From: Pierre-Emmanuel Viel
Date: Fri, 20 Dec 2013 01:00:55 +0100
Subject: [PATCH 001/117] When a cluster is empty for KMeans, it's better to
give it the point from another cluster j that is the furthest one from center
j.
---
modules/flann/include/opencv2/flann/kmeans_index.h | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/modules/flann/include/opencv2/flann/kmeans_index.h b/modules/flann/include/opencv2/flann/kmeans_index.h
index 3fea956a74..489ed80565 100644
--- a/modules/flann/include/opencv2/flann/kmeans_index.h
+++ b/modules/flann/include/opencv2/flann/kmeans_index.h
@@ -759,10 +759,13 @@ private:
for (int k=0; k
Date: Tue, 24 Dec 2013 15:14:00 +1000
Subject: [PATCH 002/117] converted necessary files for python3 compatibility
using 2to3
---
modules/java/generator/rst_parser.py | 96 +++++++++++++-------------
modules/matlab/generator/filters.py | 3 +-
modules/matlab/generator/parse_tree.py | 21 +++---
3 files changed, 60 insertions(+), 60 deletions(-)
diff --git a/modules/java/generator/rst_parser.py b/modules/java/generator/rst_parser.py
index 63f56dbaaf..d2c3d4019a 100755
--- a/modules/java/generator/rst_parser.py
+++ b/modules/java/generator/rst_parser.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python
+from __future__ import print_function
import os, sys, re, string, fnmatch
+
allmodules = ["core", "flann", "imgproc", "ml", "highgui", "video", "features2d", "calib3d", "objdetect", "legacy", "contrib", "cuda", "androidcamera", "java", "python", "stitching", "ts", "photo", "nonfree", "videostab", "ocl", "softcascade", "superres"]
verbose = False
show_warnings = True
@@ -141,10 +143,10 @@ class RstParser(object):
def parse_section_safe(self, module_name, section_name, file_name, lineno, lines):
try:
self.parse_section(module_name, section_name, file_name, lineno, lines)
- except AssertionError, args:
+ except AssertionError as args:
if show_errors:
- print >> sys.stderr, "RST parser error E%03d: assertion in \"%s\" at %s:%s" % (ERROR_001_SECTIONFAILURE, section_name, file_name, lineno)
- print >> sys.stderr, " Details: %s" % args
+ print("RST parser error E%03d: assertion in \"%s\" at %s:%s" % (ERROR_001_SECTIONFAILURE, section_name, file_name, lineno), file=sys.stderr)
+ print(" Details: %s" % args, file=sys.stderr)
def parse_section(self, module_name, section_name, file_name, lineno, lines):
self.sections_total += 1
@@ -152,7 +154,7 @@ class RstParser(object):
#if section_name.find(" ") >= 0 and section_name.find("::operator") < 0:
if (section_name.find(" ") >= 0 and not bool(re.match(r"(\w+::)*operator\s*(\w+|>>|<<|\(\)|->|\+\+|--|=|==|\+=|-=)", section_name)) ) or section_name.endswith(":"):
if show_errors:
- print >> sys.stderr, "RST parser warning W%03d: SKIPPED: \"%s\" File: %s:%s" % (WARNING_002_HDRWHITESPACE, section_name, file_name, lineno)
+ print("RST parser warning W%03d: SKIPPED: \"%s\" File: %s:%s" % (WARNING_002_HDRWHITESPACE, section_name, file_name, lineno), file=sys.stderr)
self.sections_skipped += 1
return
@@ -311,7 +313,7 @@ class RstParser(object):
if fdecl.balance != 0:
if show_critical_errors:
- print >> sys.stderr, "RST parser error E%03d: invalid parentheses balance in \"%s\" at %s:%s" % (ERROR_003_PARENTHESES, section_name, file_name, lineno)
+ print("RST parser error E%03d: invalid parentheses balance in \"%s\" at %s:%s" % (ERROR_003_PARENTHESES, section_name, file_name, lineno), file=sys.stderr)
return
# save last parameter if needed
@@ -328,7 +330,7 @@ class RstParser(object):
elif func:
if func["name"] in known_text_sections_names:
if show_errors:
- print >> sys.stderr, "RST parser warning W%03d: SKIPPED: \"%s\" File: %s:%s" % (WARNING_002_HDRWHITESPACE, section_name, file_name, lineno)
+ print("RST parser warning W%03d: SKIPPED: \"%s\" File: %s:%s" % (WARNING_002_HDRWHITESPACE, section_name, file_name, lineno), file=sys.stderr)
self.sections_skipped += 1
elif show_errors:
self.print_info(func, True, sys.stderr)
@@ -351,7 +353,7 @@ class RstParser(object):
if l.find("\t") >= 0:
whitespace_warnings += 1
if whitespace_warnings <= max_whitespace_warnings and show_warnings:
- print >> sys.stderr, "RST parser warning W%03d: tab symbol instead of space is used at %s:%s" % (WARNING_004_TABS, doc, lineno)
+ print("RST parser warning W%03d: tab symbol instead of space is used at %s:%s" % (WARNING_004_TABS, doc, lineno), file=sys.stderr)
l = l.replace("\t", " ")
# handle first line
@@ -388,8 +390,8 @@ class RstParser(object):
def add_new_fdecl(self, func, decl):
if decl.fdecl.endswith(";"):
- print >> sys.stderr, "RST parser error E%03d: unexpected semicolon at the end of declaration in \"%s\" at %s:%s" \
- % (ERROR_011_EOLEXPECTED, func["name"], func["file"], func["line"])
+ print("RST parser error E%03d: unexpected semicolon at the end of declaration in \"%s\" at %s:%s" \
+ % (ERROR_011_EOLEXPECTED, func["name"], func["file"], func["line"]), file=sys.stderr)
decls = func.get("decls", [])
if (decl.lang == "C++" or decl.lang == "C"):
rst_decl = self.cpp_parser.parse_func_decl_no_wrap(decl.fdecl)
@@ -405,37 +407,37 @@ class RstParser(object):
if show_errors:
#check black_list
if decl.name not in params_blacklist.get(func["name"], []):
- print >> sys.stderr, "RST parser error E%03d: redefinition of parameter \"%s\" in \"%s\" at %s:%s" \
- % (ERROR_005_REDEFENITIONPARAM, decl.name, func["name"], func["file"], func["line"])
+ print("RST parser error E%03d: redefinition of parameter \"%s\" in \"%s\" at %s:%s" \
+ % (ERROR_005_REDEFENITIONPARAM, decl.name, func["name"], func["file"], func["line"]), file=sys.stderr)
else:
params[decl.name] = decl.comment
func["params"] = params
def print_info(self, func, skipped=False, out = sys.stdout):
- print >> out
+ print(file=out)
if skipped:
- print >> out, "SKIPPED DEFINITION:"
- print >> out, "name: %s" % (func.get("name","~empty~"))
- print >> out, "file: %s:%s" % (func.get("file","~empty~"), func.get("line","~empty~"))
- print >> out, "is class: %s" % func.get("isclass", False)
- print >> out, "is struct: %s" % func.get("isstruct", False)
- print >> out, "module: %s" % func.get("module","~unknown~")
- print >> out, "namespace: %s" % func.get("namespace", "~empty~")
- print >> out, "class: %s" % (func.get("class","~empty~"))
- print >> out, "method: %s" % (func.get("method","~empty~"))
- print >> out, "brief: %s" % (func.get("brief","~empty~"))
+ print("SKIPPED DEFINITION:", file=out)
+ print("name: %s" % (func.get("name","~empty~")), file=out)
+ print("file: %s:%s" % (func.get("file","~empty~"), func.get("line","~empty~")), file=out)
+ print("is class: %s" % func.get("isclass", False), file=out)
+ print("is struct: %s" % func.get("isstruct", False), file=out)
+ print("module: %s" % func.get("module","~unknown~"), file=out)
+ print("namespace: %s" % func.get("namespace", "~empty~"), file=out)
+ print("class: %s" % (func.get("class","~empty~")), file=out)
+ print("method: %s" % (func.get("method","~empty~")), file=out)
+ print("brief: %s" % (func.get("brief","~empty~")), file=out)
if "decls" in func:
- print >> out, "declarations:"
+ print("declarations:", file=out)
for d in func["decls"]:
- print >> out, " %7s: %s" % (d[0], re.sub(r"[ ]+", " ", d[1]))
+ print(" %7s: %s" % (d[0], re.sub(r"[ ]+", " ", d[1])), file=out)
if "seealso" in func:
- print >> out, "seealso: ", func["seealso"]
+ print("seealso: ", func["seealso"], file=out)
if "params" in func:
- print >> out, "parameters:"
+ print("parameters:", file=out)
for name, comment in func["params"].items():
- print >> out, "%23s: %s" % (name, comment)
- print >> out, "long: %s" % (func.get("long","~empty~"))
- print >> out
+ print("%23s: %s" % (name, comment), file=out)
+ print("long: %s" % (func.get("long","~empty~")), file=out)
+ print(file=out)
def validate(self, func):
if func.get("decls", None) is None:
@@ -443,13 +445,13 @@ class RstParser(object):
return False
if func["name"] in self.definitions:
if show_errors:
- print >> sys.stderr, "RST parser error E%03d: \"%s\" from: %s:%s is already documented at %s:%s" \
- % (ERROR_006_REDEFENITIONFUNC, func["name"], func["file"], func["line"], self.definitions[func["name"]]["file"], self.definitions[func["name"]]["line"])
+ print("RST parser error E%03d: \"%s\" from: %s:%s is already documented at %s:%s" \
+ % (ERROR_006_REDEFENITIONFUNC, func["name"], func["file"], func["line"], self.definitions[func["name"]]["file"], self.definitions[func["name"]]["line"]), file=sys.stderr)
return False
return self.validateParams(func)
def validateParams(self, func):
- documentedParams = func.get("params", {}).keys()
+ documentedParams = list(func.get("params", {}).keys())
params = []
for decl in func.get("decls", []):
@@ -464,13 +466,13 @@ class RstParser(object):
# 1. all params are documented
for p in params:
if p not in documentedParams and show_warnings:
- print >> sys.stderr, "RST parser warning W%03d: parameter \"%s\" of \"%s\" is undocumented. %s:%s" % (WARNING_007_UNDOCUMENTEDPARAM, p, func["name"], func["file"], func["line"])
+ print("RST parser warning W%03d: parameter \"%s\" of \"%s\" is undocumented. %s:%s" % (WARNING_007_UNDOCUMENTEDPARAM, p, func["name"], func["file"], func["line"]), file=sys.stderr)
# 2. only real params are documented
for p in documentedParams:
if p not in params and show_warnings:
if p not in params_blacklist.get(func["name"], []):
- print >> sys.stderr, "RST parser warning W%03d: unexisting parameter \"%s\" of \"%s\" is documented at %s:%s" % (WARNING_008_MISSINGPARAM, p, func["name"], func["file"], func["line"])
+ print("RST parser warning W%03d: unexisting parameter \"%s\" of \"%s\" is documented at %s:%s" % (WARNING_008_MISSINGPARAM, p, func["name"], func["file"], func["line"]), file=sys.stderr)
return True
def normalize(self, func):
@@ -541,7 +543,7 @@ class RstParser(object):
func["name"] = fname[4:]
func["method"] = fname[4:]
elif show_warnings:
- print >> sys.stderr, "RST parser warning W%03d: \"%s\" - section name is \"%s\" instead of \"%s\" at %s:%s" % (WARNING_009_HDRMISMATCH, fname, func["name"], fname[6:], func["file"], func["line"])
+ print("RST parser warning W%03d: \"%s\" - section name is \"%s\" instead of \"%s\" at %s:%s" % (WARNING_009_HDRMISMATCH, fname, func["name"], fname[6:], func["file"], func["line"]), file=sys.stderr)
#self.print_info(func)
def normalizeText(self, s):
@@ -632,11 +634,11 @@ class RstParser(object):
return s
def printSummary(self):
- print "RST Parser Summary:"
- print " Total sections: %s" % self.sections_total
- print " Skipped sections: %s" % self.sections_skipped
- print " Parsed sections: %s" % self.sections_parsed
- print " Invalid sections: %s" % (self.sections_total - self.sections_parsed - self.sections_skipped)
+ print("RST Parser Summary:")
+ print(" Total sections: %s" % self.sections_total)
+ print(" Skipped sections: %s" % self.sections_skipped)
+ print(" Parsed sections: %s" % self.sections_parsed)
+ print(" Invalid sections: %s" % (self.sections_total - self.sections_parsed - self.sections_skipped))
# statistic by language
stat = {}
@@ -651,12 +653,12 @@ class RstParser(object):
for decl in d.get("decls", []):
stat[decl[0]] = stat.get(decl[0], 0) + 1
- print
- print " classes documented: %s" % classes
- print " structs documented: %s" % structs
+ print()
+ print(" classes documented: %s" % classes)
+ print(" structs documented: %s" % structs)
for lang in sorted(stat.items()):
- print " %7s functions documented: %s" % lang
- print
+ print(" %7s functions documented: %s" % lang)
+ print()
def mathReplace2(match):
m = mathReplace(match)
@@ -743,7 +745,7 @@ def mathReplace(match):
if __name__ == "__main__":
if len(sys.argv) < 2:
- print "Usage:\n", os.path.basename(sys.argv[0]), " "
+ print("Usage:\n", os.path.basename(sys.argv[0]), " ")
exit(0)
if len(sys.argv) >= 3:
@@ -759,7 +761,7 @@ if __name__ == "__main__":
module = sys.argv[1]
if module != "all" and not os.path.isdir(os.path.join(rst_parser_dir, "../../" + module)):
- print "RST parser error E%03d: module \"%s\" could not be found." % (ERROR_010_NOMODULE, module)
+ print("RST parser error E%03d: module \"%s\" could not be found." % (ERROR_010_NOMODULE, module))
exit(1)
parser = RstParser(hdr_parser.CppHeaderParser())
diff --git a/modules/matlab/generator/filters.py b/modules/matlab/generator/filters.py
index 6251c8305b..de69ff7e41 100644
--- a/modules/matlab/generator/filters.py
+++ b/modules/matlab/generator/filters.py
@@ -1,5 +1,4 @@
from textwrap import TextWrapper
-from string import split, join
import re, os
# precompile a URL matching regular expression
urlexpr = re.compile(r"((https?):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)", re.MULTILINE|re.UNICODE)
@@ -177,4 +176,4 @@ def comment(text, wrap=80, escape='% ', escape_first='', escape_last=''):
escapn = '\n'+escape
lines = text.split('\n')
wlines = (tw.wrap(line) for line in lines)
- return escape_first+escape+join((join(line, escapn) for line in wlines), escapn)+escape_last
+ return escape_first+escape+escapn.join(escapn.join(line) for line in wlines)+escape_last
diff --git a/modules/matlab/generator/parse_tree.py b/modules/matlab/generator/parse_tree.py
index daea53c2f2..21c4899ffd 100644
--- a/modules/matlab/generator/parse_tree.py
+++ b/modules/matlab/generator/parse_tree.py
@@ -1,4 +1,3 @@
-from string import join
from textwrap import fill
from filters import *
@@ -74,7 +73,7 @@ class ParseTree(object):
self.namespaces = namespaces if namespaces else []
def __str__(self):
- return join((ns.__str__() for ns in self.namespaces), '\n\n\n')
+ return '\n\n\n'.join(ns.__str__() for ns in self.namespaces)
def build(self, namespaces):
babel = Translator()
@@ -94,7 +93,7 @@ class ParseTree(object):
constants.append(obj)
else:
raise TypeError('Unexpected object type: '+str(type(obj)))
- self.namespaces.append(Namespace(name, constants, class_tree.values(), methods))
+ self.namespaces.append(Namespace(name, constants, list(class_tree.values()), methods))
def insertIntoClassTree(self, obj, class_tree):
cname = obj.name if type(obj) is Class else obj.clss
@@ -208,9 +207,9 @@ class Namespace(object):
def __str__(self):
return 'namespace '+self.name+' {\n\n'+\
- (join((c.__str__() for c in self.constants), '\n')+'\n\n' if self.constants else '')+\
- (join((f.__str__() for f in self.methods), '\n')+'\n\n' if self.methods else '')+\
- (join((o.__str__() for o in self.classes), '\n\n') if self.classes else '')+'\n};'
+ ('\n'.join(c.__str__() for c in self.constants)+'\n\n' if self.constants else '')+\
+ ('\n'.join(f.__str__() for f in self.methods)+'\n\n' if self.methods else '')+\
+ ('\n\n'.join(o.__str__() for o in self.classes) if self.classes else '')+'\n};'
class Class(object):
"""
@@ -228,8 +227,8 @@ class Class(object):
def __str__(self):
return 'class '+self.name+' {\n\t'+\
- (join((c.__str__() for c in self.constants), '\n\t')+'\n\n\t' if self.constants else '')+\
- (join((f.__str__() for f in self.methods), '\n\t') if self.methods else '')+'\n};'
+ ('\n\t'.join(c.__str__() for c in self.constants)+'\n\n\t' if self.constants else '')+\
+ ('\n\t'.join(f.__str__() for f in self.methods) if self.methods else '')+'\n};'
class Method(object):
"""
@@ -260,7 +259,7 @@ class Method(object):
def __str__(self):
return (self.rtp+' ' if self.rtp else '')+self.name+'('+\
- join((arg.__str__() for arg in self.req+self.opt), ', ')+\
+ ', '.join(arg.__str__() for arg in self.req+self.opt)+\
')'+(' const' if self.const else '')+';'
class Argument(object):
@@ -343,11 +342,11 @@ def todict(obj, classkey=None):
for k in obj.keys():
obj[k] = todict(obj[k], classkey)
return obj
- elif hasattr(obj, "__iter__"):
+ elif isinstance(obj, list):
return [todict(v, classkey) for v in obj]
elif hasattr(obj, "__dict__"):
data = dict([(key, todict(value, classkey))
- for key, value in obj.__dict__.iteritems()
+ for key, value in obj.__dict__.items()
if not callable(value) and not key.startswith('_')])
if classkey is not None and hasattr(obj, "__class__"):
data[classkey] = obj.__class__.__name__
From 7cad2c6788113f9b3e60846323e9bf3da60cc531 Mon Sep 17 00:00:00 2001
From: Hilton Bristow
Date: Tue, 24 Dec 2013 15:15:06 +1000
Subject: [PATCH 003/117] fixed relative imports in Jinja for python3
---
3rdparty/jinja2/markupsafe/__init__.py | 4 ++--
3rdparty/jinja2/markupsafe/_native.py | 2 +-
3rdparty/jinja2/utils.py | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/3rdparty/jinja2/markupsafe/__init__.py b/3rdparty/jinja2/markupsafe/__init__.py
index f13d7070df..a602dd5554 100644
--- a/3rdparty/jinja2/markupsafe/__init__.py
+++ b/3rdparty/jinja2/markupsafe/__init__.py
@@ -9,7 +9,7 @@
:license: BSD, see LICENSE for more details.
"""
import re
-from _compat import text_type, string_types, int_types, \
+from ._compat import text_type, string_types, int_types, \
unichr, PY2
@@ -227,7 +227,7 @@ class _MarkupEscapeHelper(object):
try:
from _speedups import escape, escape_silent, soft_unicode
except ImportError:
- from _native import escape, escape_silent, soft_unicode
+ from ._native import escape, escape_silent, soft_unicode
if not PY2:
soft_str = soft_unicode
diff --git a/3rdparty/jinja2/markupsafe/_native.py b/3rdparty/jinja2/markupsafe/_native.py
index 4b4aee3893..81d0777d13 100644
--- a/3rdparty/jinja2/markupsafe/_native.py
+++ b/3rdparty/jinja2/markupsafe/_native.py
@@ -8,7 +8,7 @@
:copyright: (c) 2010 by Armin Ronacher.
:license: BSD, see LICENSE for more details.
"""
-from _compat import text_type
+from ._compat import text_type
def escape(s):
diff --git a/3rdparty/jinja2/utils.py b/3rdparty/jinja2/utils.py
index ddc47da0a0..cbea660b41 100644
--- a/3rdparty/jinja2/utils.py
+++ b/3rdparty/jinja2/utils.py
@@ -517,4 +517,4 @@ class Joiner(object):
# Imported here because that's where it was in the past
-from markupsafe import Markup, escape, soft_unicode
+from .markupsafe import Markup, escape, soft_unicode
From 483061e802c77c3fdc0eb420d4f717b729ff4ff8 Mon Sep 17 00:00:00 2001
From: Hilton Bristow
Date: Tue, 24 Dec 2013 16:39:29 +1000
Subject: [PATCH 004/117] explicit string encoding when writing to file in
python3
---
modules/matlab/generator/build_info.py | 2 +-
modules/matlab/generator/cvmex.py | 2 +-
modules/matlab/generator/gen_matlab.py | 10 +++++-----
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/modules/matlab/generator/build_info.py b/modules/matlab/generator/build_info.py
index 65619a2a75..1340d9f926 100644
--- a/modules/matlab/generator/build_info.py
+++ b/modules/matlab/generator/build_info.py
@@ -21,7 +21,7 @@ def substitute(build, output_dir):
# populate template
populated = template.render(build=build, time=time)
with open(os.path.join(output_dir, 'buildInformation.m'), 'wb') as f:
- f.write(populated)
+ f.write(populated.encode('utf-8'))
if __name__ == "__main__":
"""
diff --git a/modules/matlab/generator/cvmex.py b/modules/matlab/generator/cvmex.py
index 52c5f649f5..731d30a0e7 100644
--- a/modules/matlab/generator/cvmex.py
+++ b/modules/matlab/generator/cvmex.py
@@ -22,7 +22,7 @@ def substitute(cv, output_dir):
# populate template
populated = template.render(cv=cv, time=time)
with open(os.path.join(output_dir, 'mex.m'), 'wb') as f:
- f.write(populated)
+ f.write(populated.encode('utf-8'))
if __name__ == "__main__":
"""
diff --git a/modules/matlab/generator/gen_matlab.py b/modules/matlab/generator/gen_matlab.py
index 49e575099a..9f0975d97b 100644
--- a/modules/matlab/generator/gen_matlab.py
+++ b/modules/matlab/generator/gen_matlab.py
@@ -105,27 +105,27 @@ class MatlabWrapperGenerator(object):
for method in namespace.methods:
populated = tfunction.render(fun=method, time=time, includes=namespace.name)
with open(output_source_dir+'/'+method.name+'.cpp', 'wb') as f:
- f.write(populated)
+ f.write(populated.encode('utf-8'))
if namespace.name in doc and method.name in doc[namespace.name]:
populated = tdoc.render(fun=method, doc=doc[namespace.name][method.name], time=time)
with open(output_class_dir+'/'+method.name+'.m', 'wb') as f:
- f.write(populated)
+ f.write(populated.encode('utf-8'))
# classes
for clss in namespace.classes:
# cpp converter
populated = tclassc.render(clss=clss, time=time)
with open(output_private_dir+'/'+clss.name+'Bridge.cpp', 'wb') as f:
- f.write(populated)
+ f.write(populated.encode('utf-8'))
# matlab classdef
populated = tclassm.render(clss=clss, time=time)
with open(output_class_dir+'/'+clss.name+'.m', 'wb') as f:
- f.write(populated)
+ f.write(populated.encode('utf-8'))
# create a global constants lookup table
const = dict(constants(todict(parse_tree.namespaces)))
populated = tconst.render(constants=const, time=time)
with open(output_dir+'/cv.m', 'wb') as f:
- f.write(populated)
+ f.write(populated.encode('utf-8'))
if __name__ == "__main__":
From aa368980246fd290ae7c842e71c1fc386cc79f3c Mon Sep 17 00:00:00 2001
From: Volodymyr Kysenko
Date: Tue, 7 Jan 2014 19:38:57 -0800
Subject: [PATCH 005/117] added epsilon value to weights in the MergeMertens in
order to avoid zero weights for pixels from uniformly filled areas of image
---
modules/photo/src/merge.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/photo/src/merge.cpp b/modules/photo/src/merge.cpp
index 7adfb5ec68..295e03c95f 100644
--- a/modules/photo/src/merge.cpp
+++ b/modules/photo/src/merge.cpp
@@ -208,7 +208,7 @@ public:
if(channels == 3) {
weights[i] = weights[i].mul(saturation);
}
- weights[i] = weights[i].mul(wellexp);
+ weights[i] = weights[i].mul(wellexp) + 1e-12f;
weight_sum += weights[i];
}
int maxlevel = static_cast(logf(static_cast(min(size.width, size.height))) / logf(2.0f));
From 89dd828e3cd4f4b46922185133e6296801b218fb Mon Sep 17 00:00:00 2001
From: Volodymyr Kysenko
Date: Thu, 9 Jan 2014 14:10:00 -0800
Subject: [PATCH 006/117] added test for correct handling of uniforma areas in
the MergeMertens
---
modules/photo/test/test_hdr.cpp | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/modules/photo/test/test_hdr.cpp b/modules/photo/test/test_hdr.cpp
index 82ae25f525..27773fb384 100644
--- a/modules/photo/test/test_hdr.cpp
+++ b/modules/photo/test/test_hdr.cpp
@@ -166,6 +166,16 @@ TEST(Photo_MergeMertens, regression)
merge->process(images, result);
result.convertTo(result, CV_8UC3, 255);
checkEqual(expected, result, 3, "Mertens");
+
+ Mat uniform(100, 100, CV_8UC3);
+ uniform = Scalar(0, 255, 0);
+
+ images.clear();
+ images.push_back(uniform);
+
+ merge->process(images, result);
+ result.convertTo(result, CV_8UC3, 255);
+ checkEqual(uniform, result, 1e-2f, "Mertens");
}
TEST(Photo_MergeDebevec, regression)
From 8f6ebc2427da0a2db870b32fc351642d65deac5d Mon Sep 17 00:00:00 2001
From: Martin Dlouhy
Date: Mon, 24 Feb 2014 07:54:08 +0100
Subject: [PATCH 007/117] fixed rotated rectangle (center instead of corner)
---
.../py_contours/py_contour_features/py_contour_features.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.rst b/doc/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.rst
index 6b7c661cc5..8220fb501e 100644
--- a/doc/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.rst
+++ b/doc/py_tutorials/py_imgproc/py_contours/py_contour_features/py_contour_features.rst
@@ -123,7 +123,7 @@ Let (x,y) be the top-left coordinate of the rectangle and (w,h) be its width and
7.b. Rotated Rectangle
-----------------------
-Here, bounding rectangle is drawn with minimum area, so it considers the rotation also. The function used is **cv2.minAreaRect()**. It returns a Box2D structure which contains following detals - ( top-left corner(x,y), (width, height), angle of rotation ). But to draw this rectangle, we need 4 corners of the rectangle. It is obtained by the function **cv2.boxPoints()**
+Here, bounding rectangle is drawn with minimum area, so it considers the rotation also. The function used is **cv2.minAreaRect()**. It returns a Box2D structure which contains following detals - ( center (x,y), (width, height), angle of rotation ). But to draw this rectangle, we need 4 corners of the rectangle. It is obtained by the function **cv2.boxPoints()**
::
rect = cv2.minAreaRect(cnt)
From 3c1917771b6f7ad532c90ab4691d2eee0cb5e0f6 Mon Sep 17 00:00:00 2001
From: Vadim Pisarevsky
Date: Wed, 5 Mar 2014 16:31:41 +0400
Subject: [PATCH 008/117] modified OpenCL SURF API and the tests in 2.4.x to
prove that it gives different from CPU results
---
.../nonfree/include/opencv2/nonfree/ocl.hpp | 22 ++++-
modules/nonfree/src/nonfree_init.cpp | 14 ++++
modules/nonfree/src/surf_ocl.cpp | 80 +++++++++++++++++++
modules/nonfree/test/test_features2d.cpp | 16 ++--
.../test_rotation_and_scale_invariance.cpp | 18 +++--
5 files changed, 136 insertions(+), 14 deletions(-)
diff --git a/modules/nonfree/include/opencv2/nonfree/ocl.hpp b/modules/nonfree/include/opencv2/nonfree/ocl.hpp
index 78b6b466c4..ad0c16ac48 100644
--- a/modules/nonfree/include/opencv2/nonfree/ocl.hpp
+++ b/modules/nonfree/include/opencv2/nonfree/ocl.hpp
@@ -53,7 +53,7 @@ namespace cv
//! Speeded up robust features, port from GPU module.
////////////////////////////////// SURF //////////////////////////////////////////
- class CV_EXPORTS SURF_OCL
+ class CV_EXPORTS SURF_OCL : public Feature2D
{
public:
enum KeypointLayout
@@ -72,10 +72,13 @@ namespace cv
SURF_OCL();
//! the full constructor taking all the necessary parameters
explicit SURF_OCL(double _hessianThreshold, int _nOctaves = 4,
- int _nOctaveLayers = 2, bool _extended = false, float _keypointsRatio = 0.01f, bool _upright = false);
+ int _nOctaveLayers = 2, bool _extended = true, float _keypointsRatio = 0.01f, bool _upright = false);
//! returns the descriptor size in float's (64 or 128)
int descriptorSize() const;
+
+ int descriptorType() const;
+
//! upload host keypoints to device memory
void uploadKeypoints(const vector &keypoints, oclMat &keypointsocl);
//! download keypoints from device to host memory
@@ -103,6 +106,17 @@ namespace cv
void operator()(const oclMat &img, const oclMat &mask, std::vector &keypoints, std::vector &descriptors,
bool useProvidedKeypoints = false);
+ //! finds the keypoints using fast hessian detector used in SURF
+ void operator()(InputArray img, InputArray mask,
+ CV_OUT vector& keypoints) const;
+ //! finds the keypoints and computes their descriptors. Optionally it can compute descriptors for the user-provided keypoints
+ void operator()(InputArray img, InputArray mask,
+ CV_OUT vector& keypoints,
+ OutputArray descriptors,
+ bool useProvidedKeypoints=false) const;
+
+ AlgorithmInfo* info() const;
+
void releaseMemory();
// SURF parameters
@@ -116,7 +130,9 @@ namespace cv
oclMat sum, mask1, maskSum, intBuffer;
oclMat det, trace;
oclMat maxPosBuffer;
-
+ protected:
+ void detectImpl( const Mat& image, vector& keypoints, const Mat& mask) const;
+ void computeImpl( const Mat& image, vector& keypoints, Mat& descriptors) const;
};
}
}
diff --git a/modules/nonfree/src/nonfree_init.cpp b/modules/nonfree/src/nonfree_init.cpp
index f18e7d81d9..136b362ca4 100644
--- a/modules/nonfree/src/nonfree_init.cpp
+++ b/modules/nonfree/src/nonfree_init.cpp
@@ -63,6 +63,20 @@ CV_INIT_ALGORITHM(SIFT, "Feature2D.SIFT",
obj.info()->addParam(obj, "edgeThreshold", obj.edgeThreshold);
obj.info()->addParam(obj, "sigma", obj.sigma))
+#ifdef HAVE_OPENCV_OCL
+
+namespace ocl {
+CV_INIT_ALGORITHM(SURF_OCL, "Feature2D.SURF_OCL",
+ obj.info()->addParam(obj, "hessianThreshold", obj.hessianThreshold);
+ obj.info()->addParam(obj, "nOctaves", obj.nOctaves);
+ obj.info()->addParam(obj, "nOctaveLayers", obj.nOctaveLayers);
+ obj.info()->addParam(obj, "extended", obj.extended);
+ obj.info()->addParam(obj, "upright", obj.upright))
+}
+
+#endif
+
+
///////////////////////////////////////////////////////////////////////////////////////////////////////////
bool initModule_nonfree(void)
diff --git a/modules/nonfree/src/surf_ocl.cpp b/modules/nonfree/src/surf_ocl.cpp
index 293fd84b56..2922c2cee6 100644
--- a/modules/nonfree/src/surf_ocl.cpp
+++ b/modules/nonfree/src/surf_ocl.cpp
@@ -305,6 +305,11 @@ int cv::ocl::SURF_OCL::descriptorSize() const
return extended ? 128 : 64;
}
+int cv::ocl::SURF_OCL::descriptorType() const
+{
+ return CV_32F;
+}
+
void cv::ocl::SURF_OCL::uploadKeypoints(const vector &keypoints, oclMat &keypointsGPU)
{
if (keypoints.empty())
@@ -447,6 +452,81 @@ void cv::ocl::SURF_OCL::operator()(const oclMat &img, const oclMat &mask, vector
downloadDescriptors(descriptorsGPU, descriptors);
}
+
+void cv::ocl::SURF_OCL::operator()(InputArray img, InputArray mask,
+ CV_OUT vector& keypoints) const
+{
+ this->operator()(img, mask, keypoints, noArray(), false);
+}
+
+void cv::ocl::SURF_OCL::operator()(InputArray img, InputArray mask, vector &keypoints,
+ OutputArray descriptors, bool useProvidedKeypoints) const
+{
+ oclMat _img, _mask;
+ if(img.kind() == _InputArray::OCL_MAT)
+ _img = *(oclMat*)img.obj;
+ else
+ _img.upload(img.getMat());
+ if(_img.channels() != 1)
+ {
+ oclMat temp;
+ cvtColor(_img, temp, COLOR_BGR2GRAY);
+ _img = temp;
+ }
+
+ if( !mask.empty() )
+ {
+ if(mask.kind() == _InputArray::OCL_MAT)
+ _mask = *(oclMat*)mask.obj;
+ else
+ _mask.upload(mask.getMat());
+ }
+
+ SURF_OCL_Invoker surf((SURF_OCL&)*this, _img, _mask);
+ oclMat keypointsGPU;
+
+ if (!useProvidedKeypoints || !upright)
+ ((SURF_OCL*)this)->uploadKeypoints(keypoints, keypointsGPU);
+
+ if (!useProvidedKeypoints)
+ surf.detectKeypoints(keypointsGPU);
+ else if (!upright)
+ surf.findOrientation(keypointsGPU);
+ if(keypointsGPU.cols*keypointsGPU.rows != 0)
+ ((SURF_OCL*)this)->downloadKeypoints(keypointsGPU, keypoints);
+
+ if( descriptors.needed() )
+ {
+ oclMat descriptorsGPU;
+ surf.computeDescriptors(keypointsGPU, descriptorsGPU, descriptorSize());
+ Size sz = descriptorsGPU.size();
+ if( descriptors.kind() == _InputArray::STD_VECTOR )
+ {
+ CV_Assert(descriptors.type() == CV_32F);
+ std::vector* v = (std::vector*)descriptors.obj;
+ v->resize(sz.width*sz.height);
+ Mat m(sz, CV_32F, &v->at(0));
+ descriptorsGPU.download(m);
+ }
+ else
+ {
+ descriptors.create(sz, CV_32F);
+ Mat m = descriptors.getMat();
+ descriptorsGPU.download(m);
+ }
+ }
+}
+
+void cv::ocl::SURF_OCL::detectImpl( const Mat& image, vector& keypoints, const Mat& mask) const
+{
+ (*this)(image, mask, keypoints, noArray(), false);
+}
+
+void cv::ocl::SURF_OCL::computeImpl( const Mat& image, vector& keypoints, Mat& descriptors) const
+{
+ (*this)(image, Mat(), keypoints, descriptors, true);
+}
+
void cv::ocl::SURF_OCL::releaseMemory()
{
sum.release();
diff --git a/modules/nonfree/test/test_features2d.cpp b/modules/nonfree/test/test_features2d.cpp
index b680d948b8..66a35931ad 100644
--- a/modules/nonfree/test/test_features2d.cpp
+++ b/modules/nonfree/test/test_features2d.cpp
@@ -50,6 +50,12 @@ const string DETECTOR_DIR = FEATURES2D_DIR + "/feature_detectors";
const string DESCRIPTOR_DIR = FEATURES2D_DIR + "/descriptor_extractors";
const string IMAGE_FILENAME = "tsukuba.png";
+#ifdef HAVE_OPENCV_OCL
+#define SURF_NAME "SURF_OCL"
+#else
+#define SURF_NAME "SURF"
+#endif
+
/****************************************************************************************\
* Regression tests for feature detectors comparing keypoints. *
\****************************************************************************************/
@@ -978,7 +984,7 @@ TEST( Features2d_Detector_SIFT, regression )
TEST( Features2d_Detector_SURF, regression )
{
- CV_FeatureDetectorTest test( "detector-surf", FeatureDetector::create("SURF") );
+ CV_FeatureDetectorTest test( "detector-surf", FeatureDetector::create(SURF_NAME) );
test.safe_run();
}
@@ -995,7 +1001,7 @@ TEST( Features2d_DescriptorExtractor_SIFT, regression )
TEST( Features2d_DescriptorExtractor_SURF, regression )
{
CV_DescriptorExtractorTest > test( "descriptor-surf", 0.05f,
- DescriptorExtractor::create("SURF") );
+ DescriptorExtractor::create(SURF_NAME) );
test.safe_run();
}
@@ -1036,10 +1042,10 @@ TEST(Features2d_BruteForceDescriptorMatcher_knnMatch, regression)
const int sz = 100;
const int k = 3;
- Ptr ext = DescriptorExtractor::create("SURF");
+ Ptr ext = DescriptorExtractor::create(SURF_NAME);
ASSERT_TRUE(ext != NULL);
- Ptr det = FeatureDetector::create("SURF");
+ Ptr det = FeatureDetector::create(SURF_NAME);
//"%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n"
ASSERT_TRUE(det != NULL);
@@ -1144,7 +1150,7 @@ protected:
};
TEST(Features2d_SIFTHomographyTest, regression) { CV_DetectPlanarTest test("SIFT", 80); test.safe_run(); }
-TEST(Features2d_SURFHomographyTest, regression) { CV_DetectPlanarTest test("SURF", 80); test.safe_run(); }
+TEST(Features2d_SURFHomographyTest, regression) { CV_DetectPlanarTest test(SURF_NAME, 80); test.safe_run(); }
class FeatureDetectorUsingMaskTest : public cvtest::BaseTest
{
diff --git a/modules/nonfree/test/test_rotation_and_scale_invariance.cpp b/modules/nonfree/test/test_rotation_and_scale_invariance.cpp
index 7ca9e3dd74..255cad313c 100644
--- a/modules/nonfree/test/test_rotation_and_scale_invariance.cpp
+++ b/modules/nonfree/test/test_rotation_and_scale_invariance.cpp
@@ -48,6 +48,12 @@ using namespace cv;
const string IMAGE_TSUKUBA = "/features2d/tsukuba.png";
const string IMAGE_BIKES = "/detectors_descriptors_evaluation/images_datasets/bikes/img1.png";
+#ifdef HAVE_OPENCV_OCL
+#define SURF_NAME "Feature2D.SURF_OCL"
+#else
+#define SURF_NAME "Feature2D.SURF"
+#endif
+
#define SHOW_DEBUG_LOG 0
static
@@ -615,7 +621,7 @@ protected:
*/
TEST(Features2d_RotationInvariance_Detector_SURF, regression)
{
- DetectorRotationInvarianceTest test(Algorithm::create("Feature2D.SURF"),
+ DetectorRotationInvarianceTest test(Algorithm::create(SURF_NAME),
0.44f,
0.76f);
test.safe_run();
@@ -634,8 +640,8 @@ TEST(Features2d_RotationInvariance_Detector_SIFT, DISABLED_regression)
*/
TEST(Features2d_RotationInvariance_Descriptor_SURF, regression)
{
- DescriptorRotationInvarianceTest test(Algorithm::create("Feature2D.SURF"),
- Algorithm::create("Feature2D.SURF"),
+ DescriptorRotationInvarianceTest test(Algorithm::create(SURF_NAME),
+ Algorithm::create(SURF_NAME),
NORM_L1,
0.83f);
test.safe_run();
@@ -655,7 +661,7 @@ TEST(Features2d_RotationInvariance_Descriptor_SIFT, regression)
*/
TEST(Features2d_ScaleInvariance_Detector_SURF, regression)
{
- DetectorScaleInvarianceTest test(Algorithm::create("Feature2D.SURF"),
+ DetectorScaleInvarianceTest test(Algorithm::create(SURF_NAME),
0.64f,
0.84f);
test.safe_run();
@@ -674,8 +680,8 @@ TEST(Features2d_ScaleInvariance_Detector_SIFT, regression)
*/
TEST(Features2d_ScaleInvariance_Descriptor_SURF, regression)
{
- DescriptorScaleInvarianceTest test(Algorithm::create("Feature2D.SURF"),
- Algorithm::create("Feature2D.SURF"),
+ DescriptorScaleInvarianceTest test(Algorithm::create(SURF_NAME),
+ Algorithm::create(SURF_NAME),
NORM_L1,
0.61f);
test.safe_run();
From da70b04262fa6c7c0d29d6ca69b496cab5e31259 Mon Sep 17 00:00:00 2001
From: Vadim Pisarevsky
Date: Wed, 5 Mar 2014 17:04:49 +0400
Subject: [PATCH 009/117] made SURF_OCL default constructor parameters the same
as SURF
---
modules/nonfree/src/surf_ocl.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/nonfree/src/surf_ocl.cpp b/modules/nonfree/src/surf_ocl.cpp
index 2922c2cee6..e6fd6eeb6b 100644
--- a/modules/nonfree/src/surf_ocl.cpp
+++ b/modules/nonfree/src/surf_ocl.cpp
@@ -283,9 +283,9 @@ private:
cv::ocl::SURF_OCL::SURF_OCL()
{
hessianThreshold = 100.0f;
- extended = true;
+ extended = false;
nOctaves = 4;
- nOctaveLayers = 2;
+ nOctaveLayers = 3;
keypointsRatio = 0.01f;
upright = false;
}
From 60ce2b2e9f2266a01c193b9e3c67d8dfcd8e35fd Mon Sep 17 00:00:00 2001
From: Vadim Pisarevsky
Date: Wed, 5 Mar 2014 17:10:51 +0400
Subject: [PATCH 010/117] modified SURF's performance test to test OpenCL
version as well
---
modules/nonfree/perf/perf_surf.cpp | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/modules/nonfree/perf/perf_surf.cpp b/modules/nonfree/perf/perf_surf.cpp
index 20935a9a1e..f16b348231 100644
--- a/modules/nonfree/perf/perf_surf.cpp
+++ b/modules/nonfree/perf/perf_surf.cpp
@@ -12,6 +12,12 @@ typedef perf::TestBaseWithParam surf;
"cv/detectors_descriptors_evaluation/images_datasets/leuven/img1.png",\
"stitching/a3.png"
+#ifdef HAVE_OPENCV_OCL
+typedef ocl::SURF_OCL surf_class;
+#else
+typdef SURF surf_class;
+#endif
+
PERF_TEST_P(surf, detect, testing::Values(SURF_IMAGES))
{
String filename = getDataPath(GetParam());
@@ -22,7 +28,7 @@ PERF_TEST_P(surf, detect, testing::Values(SURF_IMAGES))
Mat mask;
declare.in(frame).time(90);
- SURF detector;
+ surf_class detector;
vector points;
TEST_CYCLE() detector(frame, mask, points);
@@ -41,7 +47,7 @@ PERF_TEST_P(surf, extract, testing::Values(SURF_IMAGES))
Mat mask;
declare.in(frame).time(90);
- SURF detector;
+ surf_class detector;
vector points;
vector descriptors;
detector(frame, mask, points);
@@ -61,7 +67,7 @@ PERF_TEST_P(surf, full, testing::Values(SURF_IMAGES))
Mat mask;
declare.in(frame).time(90);
- SURF detector;
+ surf_class detector;
vector points;
vector descriptors;
From 22f42a639fdc0233a740bbad06536f32d7d99382 Mon Sep 17 00:00:00 2001
From: Vadim Pisarevsky
Date: Wed, 5 Mar 2014 18:48:19 +0400
Subject: [PATCH 011/117] fixed doc builder warnings; make sure the tests give
reasonable results when OpenCL is not available
---
modules/nonfree/doc/feature_detection.rst | 2 +-
.../nonfree/include/opencv2/nonfree/ocl.hpp | 2 +-
modules/nonfree/perf/perf_surf.cpp | 29 ++++++++++++------
modules/nonfree/test/test_features2d.cpp | 30 ++++++++++++++-----
4 files changed, 44 insertions(+), 19 deletions(-)
diff --git a/modules/nonfree/doc/feature_detection.rst b/modules/nonfree/doc/feature_detection.rst
index f97dec1002..190c9f8475 100644
--- a/modules/nonfree/doc/feature_detection.rst
+++ b/modules/nonfree/doc/feature_detection.rst
@@ -240,7 +240,7 @@ The class ``SURF_GPU`` uses some buffers and provides access to it. All buffers
ocl::SURF_OCL
-------------
-.. ocv:class:: ocl::SURF_OCL
+.. ocv:class:: ocl::SURF_OCL : public Feature2D
Class used for extracting Speeded Up Robust Features (SURF) from an image. ::
diff --git a/modules/nonfree/include/opencv2/nonfree/ocl.hpp b/modules/nonfree/include/opencv2/nonfree/ocl.hpp
index ad0c16ac48..5d9eb86b50 100644
--- a/modules/nonfree/include/opencv2/nonfree/ocl.hpp
+++ b/modules/nonfree/include/opencv2/nonfree/ocl.hpp
@@ -114,7 +114,7 @@ namespace cv
CV_OUT vector& keypoints,
OutputArray descriptors,
bool useProvidedKeypoints=false) const;
-
+
AlgorithmInfo* info() const;
void releaseMemory();
diff --git a/modules/nonfree/perf/perf_surf.cpp b/modules/nonfree/perf/perf_surf.cpp
index f16b348231..84c21b4691 100644
--- a/modules/nonfree/perf/perf_surf.cpp
+++ b/modules/nonfree/perf/perf_surf.cpp
@@ -13,9 +13,19 @@ typedef perf::TestBaseWithParam surf;
"stitching/a3.png"
#ifdef HAVE_OPENCV_OCL
-typedef ocl::SURF_OCL surf_class;
+static Ptr getSURF()
+{
+ ocl::PlatformsInfo p;
+ if(ocl::getOpenCLPlatforms(p) > 0)
+ return new ocl::SURF_OCL;
+ else
+ return new SURF;
+}
#else
-typdef SURF surf_class;
+static Ptr getSURF()
+{
+ return new SURF;
+}
#endif
PERF_TEST_P(surf, detect, testing::Values(SURF_IMAGES))
@@ -28,10 +38,11 @@ PERF_TEST_P(surf, detect, testing::Values(SURF_IMAGES))
Mat mask;
declare.in(frame).time(90);
- surf_class detector;
+ Ptr detector = getSURF();
+
vector points;
- TEST_CYCLE() detector(frame, mask, points);
+ TEST_CYCLE() detector->operator()(frame, mask, points, noArray());
SANITY_CHECK_KEYPOINTS(points, 1e-3);
}
@@ -47,12 +58,12 @@ PERF_TEST_P(surf, extract, testing::Values(SURF_IMAGES))
Mat mask;
declare.in(frame).time(90);
- surf_class detector;
+ Ptr detector = getSURF();
vector points;
vector descriptors;
- detector(frame, mask, points);
+ detector->operator()(frame, mask, points, noArray());
- TEST_CYCLE() detector(frame, mask, points, descriptors, true);
+ TEST_CYCLE() detector->operator()(frame, mask, points, descriptors, true);
SANITY_CHECK(descriptors, 1e-4);
}
@@ -67,11 +78,11 @@ PERF_TEST_P(surf, full, testing::Values(SURF_IMAGES))
Mat mask;
declare.in(frame).time(90);
- surf_class detector;
+ Ptr detector = getSURF();
vector points;
vector descriptors;
- TEST_CYCLE() detector(frame, mask, points, descriptors, false);
+ TEST_CYCLE() detector->operator()(frame, mask, points, descriptors, false);
SANITY_CHECK_KEYPOINTS(points, 1e-3);
SANITY_CHECK(descriptors, 1e-4);
diff --git a/modules/nonfree/test/test_features2d.cpp b/modules/nonfree/test/test_features2d.cpp
index 66a35931ad..3dfad7cdab 100644
--- a/modules/nonfree/test/test_features2d.cpp
+++ b/modules/nonfree/test/test_features2d.cpp
@@ -51,9 +51,19 @@ const string DESCRIPTOR_DIR = FEATURES2D_DIR + "/descriptor_extractors";
const string IMAGE_FILENAME = "tsukuba.png";
#ifdef HAVE_OPENCV_OCL
-#define SURF_NAME "SURF_OCL"
+static Ptr getSURF()
+{
+ ocl::PlatformsInfo p;
+ if(ocl::getOpenCLPlatforms(p) > 0)
+ return new ocl::SURF_OCL;
+ else
+ return new SURF;
+}
#else
-#define SURF_NAME "SURF"
+static Ptr getSURF()
+{
+ return new SURF;
+}
#endif
/****************************************************************************************\
@@ -984,7 +994,7 @@ TEST( Features2d_Detector_SIFT, regression )
TEST( Features2d_Detector_SURF, regression )
{
- CV_FeatureDetectorTest test( "detector-surf", FeatureDetector::create(SURF_NAME) );
+ CV_FeatureDetectorTest test( "detector-surf", Ptr(getSURF()) );
test.safe_run();
}
@@ -1001,7 +1011,7 @@ TEST( Features2d_DescriptorExtractor_SIFT, regression )
TEST( Features2d_DescriptorExtractor_SURF, regression )
{
CV_DescriptorExtractorTest > test( "descriptor-surf", 0.05f,
- DescriptorExtractor::create(SURF_NAME) );
+ Ptr(getSURF()) );
test.safe_run();
}
@@ -1042,10 +1052,10 @@ TEST(Features2d_BruteForceDescriptorMatcher_knnMatch, regression)
const int sz = 100;
const int k = 3;
- Ptr ext = DescriptorExtractor::create(SURF_NAME);
+ Ptr ext = Ptr(getSURF());
ASSERT_TRUE(ext != NULL);
- Ptr det = FeatureDetector::create(SURF_NAME);
+ Ptr det = Ptr(getSURF());
//"%YAML:1.0\nhessianThreshold: 8000.\noctaves: 3\noctaveLayers: 4\nupright: 0\n"
ASSERT_TRUE(det != NULL);
@@ -1102,7 +1112,11 @@ public:
protected:
void run(int)
{
- Ptr f = Algorithm::create("Feature2D." + fname);
+ Ptr f;
+ if(fname == "SURF")
+ f = getSURF();
+ else
+ f = Algorithm::create("Feature2D." + fname);
if(f.empty())
return;
string path = string(ts->get_data_path()) + "detectors_descriptors_evaluation/planar/";
@@ -1150,7 +1164,7 @@ protected:
};
TEST(Features2d_SIFTHomographyTest, regression) { CV_DetectPlanarTest test("SIFT", 80); test.safe_run(); }
-TEST(Features2d_SURFHomographyTest, regression) { CV_DetectPlanarTest test(SURF_NAME, 80); test.safe_run(); }
+TEST(Features2d_SURFHomographyTest, regression) { CV_DetectPlanarTest test("SURF", 80); test.safe_run(); }
class FeatureDetectorUsingMaskTest : public cvtest::BaseTest
{
From b3e18d23a31313b4885f0c2fb8ca8afc0ff8199c Mon Sep 17 00:00:00 2001
From: Alexander Smorkalov
Date: Wed, 5 Mar 2014 11:25:27 +0400
Subject: [PATCH 012/117] Implicit CUDA and OpenCL control for module
definition added.
Feature allows to exclude CUDA or OpenCL optimizations at all even CUDA is used
on build. Exclusion of CUDA or OpenCL cut unwanted dependencies.
---
cmake/OpenCVModule.cmake | 66 +++++++++++++++++--------
modules/nonfree/CMakeLists.txt | 2 +-
modules/superres/src/cuda/btv_l1_gpu.cu | 2 +-
modules/ts/CMakeLists.txt | 2 +-
4 files changed, 49 insertions(+), 23 deletions(-)
diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake
index 03818018d9..c9c351113c 100644
--- a/cmake/OpenCVModule.cmake
+++ b/cmake/OpenCVModule.cmake
@@ -479,39 +479,49 @@ endmacro()
# finds and sets headers and sources for the standard OpenCV module
# Usage:
# ocv_glob_module_sources()
-macro(ocv_glob_module_sources)
+macro(ocv_glob_module_sources EXCLUDE_CUDA EXCLUDE_OPENCL)
file(GLOB_RECURSE lib_srcs "src/*.cpp")
file(GLOB_RECURSE lib_int_hdrs "src/*.hpp" "src/*.h")
file(GLOB lib_hdrs "include/opencv2/${name}/*.hpp" "include/opencv2/${name}/*.h")
file(GLOB lib_hdrs_detail "include/opencv2/${name}/detail/*.hpp" "include/opencv2/${name}/detail/*.h")
- file(GLOB lib_cuda_srcs "src/cuda/*.cu")
- set(cuda_objs "")
- set(lib_cuda_hdrs "")
- if(HAVE_CUDA)
- ocv_include_directories(${CUDA_INCLUDE_DIRS})
- file(GLOB lib_cuda_hdrs "src/cuda/*.hpp")
+ if (NOT ${EXCLUDE_CUDA})
+ file(GLOB lib_cuda_srcs "src/cuda/*.cu")
+ set(cuda_objs "")
+ set(lib_cuda_hdrs "")
+ if(HAVE_CUDA)
+ ocv_include_directories(${CUDA_INCLUDE_DIRS})
+ file(GLOB lib_cuda_hdrs "src/cuda/*.hpp")
- ocv_cuda_compile(cuda_objs ${lib_cuda_srcs} ${lib_cuda_hdrs})
- source_group("Src\\Cuda" FILES ${lib_cuda_srcs} ${lib_cuda_hdrs})
+ ocv_cuda_compile(cuda_objs ${lib_cuda_srcs} ${lib_cuda_hdrs})
+ source_group("Src\\Cuda" FILES ${lib_cuda_srcs} ${lib_cuda_hdrs})
+ endif()
+ else()
+ set(cuda_objs "")
+ set(lib_cuda_srcs "")
+ set(lib_cuda_hdrs "")
endif()
source_group("Src" FILES ${lib_srcs} ${lib_int_hdrs})
- file(GLOB cl_kernels "src/opencl/*.cl")
- if(HAVE_opencv_ocl AND cl_kernels)
- ocv_include_directories(${OPENCL_INCLUDE_DIRS})
- add_custom_command(
- OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp"
- COMMAND ${CMAKE_COMMAND} -DCL_DIR="${CMAKE_CURRENT_SOURCE_DIR}/src/opencl" -DOUTPUT="${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" -P "${OpenCV_SOURCE_DIR}/cmake/cl2cpp.cmake"
- DEPENDS ${cl_kernels} "${OpenCV_SOURCE_DIR}/cmake/cl2cpp.cmake")
- source_group("OpenCL" FILES ${cl_kernels} "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp")
- list(APPEND lib_srcs ${cl_kernels} "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp")
+ if (NOT ${EXCLUDE_OPENCL})
+ file(GLOB cl_kernels "src/opencl/*.cl")
+ if(HAVE_opencv_ocl AND cl_kernels)
+ ocv_include_directories(${OPENCL_INCLUDE_DIRS})
+ add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp"
+ COMMAND ${CMAKE_COMMAND} -DCL_DIR="${CMAKE_CURRENT_SOURCE_DIR}/src/opencl" -DOUTPUT="${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" -P "${OpenCV_SOURCE_DIR}/cmake/cl2cpp.cmake"
+ DEPENDS ${cl_kernels} "${OpenCV_SOURCE_DIR}/cmake/cl2cpp.cmake")
+ source_group("OpenCL" FILES ${cl_kernels} "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp")
+ list(APPEND lib_srcs ${cl_kernels} "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp")
+ endif()
endif()
source_group("Include" FILES ${lib_hdrs})
source_group("Include\\detail" FILES ${lib_hdrs_detail})
+ message(":${EXCLUDE_CUDA}: ${lib_cuda_srcs}")
+
ocv_set_module_sources(${ARGN} HEADERS ${lib_hdrs} ${lib_hdrs_detail}
SOURCES ${lib_srcs} ${lib_int_hdrs} ${cuda_objs} ${lib_cuda_srcs} ${lib_cuda_hdrs})
endmacro()
@@ -614,9 +624,25 @@ endmacro()
# Usage:
# ocv_define_module(module_name [INTERNAL] [REQUIRED] [] [OPTIONAL ])
macro(ocv_define_module module_name)
- ocv_add_module(${module_name} ${ARGN})
+ set(_tmp_argn ${ARGN})
+ set(exclude_cuda 0)
+ set(exclude_opencl 0)
+ set(argv0 ${ARGV1})
+ set(argv1 ${ARGV2})
+ set(argv2 ${ARGV3})
+ foreach(i RANGE 0 2)
+ if("${argv${i}}" STREQUAL "EXCLUDE_CUDA")
+ set(exclude_cuda 1)
+ list(REMOVE_AT _tmp_argn ${i})
+ elseif ("${argv${i}}" STREQUAL "EXCLUDE_OPENCL")
+ set(exclude_opencl 1)
+ list(REMOVE_AT _tmp_argn ${i})
+ endif()
+ endforeach()
+
+ ocv_add_module(${module_name} ${_tmp_argn})
ocv_module_include_directories()
- ocv_glob_module_sources()
+ ocv_glob_module_sources(${exclude_cuda} ${exclude_opencl})
ocv_create_module()
ocv_add_precompiled_headers(${the_module})
diff --git a/modules/nonfree/CMakeLists.txt b/modules/nonfree/CMakeLists.txt
index b43273bc80..571614be0d 100644
--- a/modules/nonfree/CMakeLists.txt
+++ b/modules/nonfree/CMakeLists.txt
@@ -6,7 +6,7 @@ set(the_description "Functionality with possible limitations on the use")
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wshadow)
if(ENABLE_DYNAMIC_CUDA)
add_definitions(-DDYNAMIC_CUDA_SUPPORT)
- ocv_define_module(nonfree opencv_imgproc opencv_features2d opencv_calib3d OPTIONAL opencv_ocl)
+ ocv_define_module(nonfree EXCLUDE_CUDA opencv_imgproc opencv_features2d opencv_calib3d OPTIONAL opencv_ocl)
else()
ocv_define_module(nonfree opencv_imgproc opencv_features2d opencv_calib3d OPTIONAL opencv_gpu opencv_ocl)
endif()
diff --git a/modules/superres/src/cuda/btv_l1_gpu.cu b/modules/superres/src/cuda/btv_l1_gpu.cu
index b4d96190ae..4b0ebdc592 100644
--- a/modules/superres/src/cuda/btv_l1_gpu.cu
+++ b/modules/superres/src/cuda/btv_l1_gpu.cu
@@ -42,7 +42,7 @@
#include "opencv2/opencv_modules.hpp"
-#ifdef HAVE_OPENCV_GPU
+#if defined(HAVE_OPENCV_GPU) && !defined(DYNAMIC_CUDA_SUPPORT)
#include "opencv2/gpu/device/common.hpp"
#include "opencv2/gpu/device/transform.hpp"
diff --git a/modules/ts/CMakeLists.txt b/modules/ts/CMakeLists.txt
index bb56da2d98..dcd3e1563b 100644
--- a/modules/ts/CMakeLists.txt
+++ b/modules/ts/CMakeLists.txt
@@ -11,7 +11,7 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef)
ocv_add_module(ts opencv_core opencv_features2d)
-ocv_glob_module_sources()
+ocv_glob_module_sources(0 0)
ocv_module_include_directories()
ocv_create_module()
From 0eaeff06418223c89f86fc2fdcf48fbc90f4c4cb Mon Sep 17 00:00:00 2001
From: kurodash
Date: Fri, 7 Mar 2014 19:02:37 +0900
Subject: [PATCH 013/117] fix: use "cvAlloc" wrapper function for malloc.
---
modules/core/src/persistence.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp
index 7759f708b6..4a6e0c9ec5 100644
--- a/modules/core/src/persistence.cpp
+++ b/modules/core/src/persistence.cpp
@@ -4855,7 +4855,7 @@ cvRegisterType( const CvTypeInfo* _info )
"Type name should contain only letters, digits, - and _" );
}
- info = (CvTypeInfo*)malloc( sizeof(*info) + len + 1 );
+ info = (CvTypeInfo*)cvAlloc( sizeof(*info) + len + 1 );
*info = *_info;
info->type_name = (char*)(info + 1);
@@ -4893,7 +4893,7 @@ cvUnregisterType( const char* type_name )
if( !CvType::first || !CvType::last )
CvType::first = CvType::last = 0;
- free( info );
+ cvFree( info );
}
}
From a87607e3ef6d30a2ccd8bd3b516fde4647dce16d Mon Sep 17 00:00:00 2001
From: Firat Kalaycilar
Date: Wed, 12 Mar 2014 16:14:59 +0200
Subject: [PATCH 014/117] Fixed an issue with weight assignment causing the
resulting GMM weights to be unsorted in BackgroundSubtractorMOG2
---
modules/video/src/bgfg_gaussmix2.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/modules/video/src/bgfg_gaussmix2.cpp b/modules/video/src/bgfg_gaussmix2.cpp
index 6bbb960482..b14bc8e1e2 100644
--- a/modules/video/src/bgfg_gaussmix2.cpp
+++ b/modules/video/src/bgfg_gaussmix2.cpp
@@ -319,7 +319,7 @@ struct MOG2Invoker : ParallelLoopBody
for( int mode = 0; mode < nmodes; mode++, mean_m += nchannels )
{
float weight = alpha1*gmm[mode].weight + prune;//need only weight if fit is found
-
+ int swap_count = 0;
////
//fit not found yet
if( !fitsPDF )
@@ -384,6 +384,7 @@ struct MOG2Invoker : ParallelLoopBody
if( weight < gmm[i-1].weight )
break;
+ swap_count++;
//swap one up
std::swap(gmm[i], gmm[i-1]);
for( int c = 0; c < nchannels; c++ )
@@ -401,7 +402,7 @@ struct MOG2Invoker : ParallelLoopBody
nmodes--;
}
- gmm[mode].weight = weight;//update weight by the calculated value
+ gmm[mode-swap_count].weight = weight;//update weight by the calculated value
totalWeight += weight;
}
//go through all modes
From b96762a48ff78ba39563301e3f2be9a9b7bf5ef3 Mon Sep 17 00:00:00 2001
From: Koji Miyazato
Date: Thu, 13 Mar 2014 19:41:13 +0900
Subject: [PATCH 015/117] Fix for bug #3599: cv::FileStorage does not work for
std::vector of user-defined struct.
---
modules/core/include/opencv2/core/persistence.hpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/core/include/opencv2/core/persistence.hpp b/modules/core/include/opencv2/core/persistence.hpp
index 8f515c54dd..e00c849400 100644
--- a/modules/core/include/opencv2/core/persistence.hpp
+++ b/modules/core/include/opencv2/core/persistence.hpp
@@ -697,11 +697,11 @@ void write(FileStorage& fs, const String& name, const Range& r )
template static inline
void write( FileStorage& fs, const String& name, const std::vector<_Tp>& vec )
{
- internal::WriteStructContext ws(fs, name, FileNode::SEQ+(DataType<_Tp>::fmt != 0 ? FileNode::FLOW : 0));
+ fs << (DataType<_Tp>::fmt != 0 ? "[:" : "[");
write(fs, vec);
+ fs << "]";
}
-
static inline
void read(const FileNode& node, bool& value, bool default_value)
{
From b47bec2ed0f424a0e33ab6d2609c77847dab3c75 Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Thu, 13 Mar 2014 23:22:41 +0400
Subject: [PATCH 016/117] performance tests for ORB
---
.../perf/opencl/perf_brute_force_matcher.cpp | 6 +-
modules/features2d/perf/opencl/perf_orb.cpp | 86 +++++++++++++++++++
2 files changed, 89 insertions(+), 3 deletions(-)
create mode 100644 modules/features2d/perf/opencl/perf_orb.cpp
diff --git a/modules/features2d/perf/opencl/perf_brute_force_matcher.cpp b/modules/features2d/perf/opencl/perf_brute_force_matcher.cpp
index f7bd24cf52..2e6e574160 100644
--- a/modules/features2d/perf/opencl/perf_brute_force_matcher.cpp
+++ b/modules/features2d/perf/opencl/perf_brute_force_matcher.cpp
@@ -123,7 +123,7 @@ OCL_PERF_TEST_P(BruteForceMatcherFixture, RadiusMatch, ::testing::Combine(OCL_PE
SANITY_CHECK_MATCHES(matches1, 1e-3);
}
-}//ocl
-}//cvtest
+} // ocl
+} // cvtest
-#endif //HAVE_OPENCL
+#endif // HAVE_OPENCL
diff --git a/modules/features2d/perf/opencl/perf_orb.cpp b/modules/features2d/perf/opencl/perf_orb.cpp
new file mode 100644
index 0000000000..78a82aa449
--- /dev/null
+++ b/modules/features2d/perf/opencl/perf_orb.cpp
@@ -0,0 +1,86 @@
+#include "perf_precomp.hpp"
+#include "opencv2/ts/ocl_perf.hpp"
+
+#ifdef HAVE_OPENCL
+
+namespace cvtest {
+namespace ocl {
+
+typedef ::perf::TestBaseWithParam ORBFixture;
+
+#define ORB_IMAGES OCL_PERF_ENUM("cv/detectors_descriptors_evaluation/images_datasets/leuven/img1.png", "stitching/a3.png")
+
+OCL_PERF_TEST_P(ORBFixture, ORB_Detect, ORB_IMAGES)
+{
+ string filename = getDataPath(GetParam());
+ Mat mframe = imread(filename, IMREAD_GRAYSCALE);
+
+ if (mframe.empty())
+ FAIL() << "Unable to load source image " << filename;
+
+ UMat frame, mask;
+ mframe.copyTo(frame);
+
+ declare.in(frame);
+ ORB detector(1500, 1.3f, 1);
+ vector points;
+
+ OCL_TEST_CYCLE() detector(frame, mask, points);
+
+ sort(points.begin(), points.end(), comparators::KeypointGreater());
+ SANITY_CHECK_KEYPOINTS(points, 1e-5);
+}
+
+OCL_PERF_TEST_P(ORBFixture, ORB_Extract, ORB_IMAGES)
+{
+ string filename = getDataPath(GetParam());
+ Mat mframe = imread(filename, IMREAD_GRAYSCALE);
+
+ if (mframe.empty())
+ FAIL() << "Unable to load source image " << filename;
+
+ UMat mask, frame;
+ mframe.copyTo(frame);
+
+ declare.in(frame);
+
+ ORB detector(1500, 1.3f, 1);
+ vector points;
+ detector(frame, mask, points);
+ sort(points.begin(), points.end(), comparators::KeypointGreater());
+
+ UMat descriptors;
+
+ OCL_TEST_CYCLE() detector(frame, mask, points, descriptors, true);
+
+ SANITY_CHECK(descriptors);
+}
+
+OCL_PERF_TEST_P(ORBFixture, ORB_Full, ORB_IMAGES)
+{
+ string filename = getDataPath(GetParam());
+ Mat mframe = imread(filename, IMREAD_GRAYSCALE);
+
+ if (mframe.empty())
+ FAIL() << "Unable to load source image " << filename;
+
+ UMat mask, frame;
+ mframe.copyTo(frame);
+
+ declare.in(frame);
+ ORB detector(1500, 1.3f, 1);
+
+ vector points;
+ UMat descriptors;
+
+ OCL_TEST_CYCLE() detector(frame, mask, points, descriptors, false);
+
+ ::perf::sort(points, descriptors);
+ SANITY_CHECK_KEYPOINTS(points, 1e-5);
+ SANITY_CHECK(descriptors);
+}
+
+} // ocl
+} // cvtest
+
+#endif // HAVE_OPENCL
From f9484bae8ab748132e753b8c217c5ded36a5c9dd Mon Sep 17 00:00:00 2001
From: kuroda sho
Date: Fri, 14 Mar 2014 17:02:20 +0900
Subject: [PATCH 017/117] fix: use "cvAlloc" wrapper function for malloc.
---
modules/core/src/persistence.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp
index 4a6e0c9ec5..6847eec34d 100644
--- a/modules/core/src/persistence.cpp
+++ b/modules/core/src/persistence.cpp
@@ -4893,7 +4893,7 @@ cvUnregisterType( const char* type_name )
if( !CvType::first || !CvType::last )
CvType::first = CvType::last = 0;
- cvFree( info );
+ cvFree( &info );
}
}
From 5f94a205d14180d5fd9c0b451add6da35a2b3f9f Mon Sep 17 00:00:00 2001
From: berak
Date: Thu, 13 Mar 2014 08:39:15 +0100
Subject: [PATCH 018/117] fixed h / s ranges in histogram_calculation tutorial
literalinclude
literalinclude, dropped :lines:
---
.../histogram_comparison.rst | 90 ++-----------------
.../Histograms_Matching/compareHist_Demo.cpp | 6 +-
2 files changed, 9 insertions(+), 87 deletions(-)
diff --git a/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.rst b/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.rst
index 1a5c59de07..f5f636d08b 100644
--- a/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.rst
+++ b/doc/tutorials/imgproc/histograms/histogram_comparison/histogram_comparison.rst
@@ -84,88 +84,10 @@ Code
* **Code at glance:**
-.. code-block:: cpp
-
- #include "opencv2/highgui/highgui.hpp"
- #include "opencv2/imgproc/imgproc.hpp"
- #include
- #include
-
- using namespace std;
- using namespace cv;
-
- /** @function main */
- int main( int argc, char** argv )
- {
- Mat src_base, hsv_base;
- Mat src_test1, hsv_test1;
- Mat src_test2, hsv_test2;
- Mat hsv_half_down;
-
- /// Load three images with different environment settings
- if( argc < 4 )
- { printf("** Error. Usage: ./compareHist_Demo \n");
- return -1;
- }
-
- src_base = imread( argv[1], 1 );
- src_test1 = imread( argv[2], 1 );
- src_test2 = imread( argv[3], 1 );
-
- /// Convert to HSV
- cvtColor( src_base, hsv_base, CV_BGR2HSV );
- cvtColor( src_test1, hsv_test1, CV_BGR2HSV );
- cvtColor( src_test2, hsv_test2, CV_BGR2HSV );
-
- hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );
-
- /// Using 30 bins for hue and 32 for saturation
- int h_bins = 50; int s_bins = 60;
- int histSize[] = { h_bins, s_bins };
-
- // hue varies from 0 to 256, saturation from 0 to 180
- float h_ranges[] = { 0, 256 };
- float s_ranges[] = { 0, 180 };
-
- const float* ranges[] = { h_ranges, s_ranges };
-
- // Use the o-th and 1-st channels
- int channels[] = { 0, 1 };
-
- /// Histograms
- MatND hist_base;
- MatND hist_half_down;
- MatND hist_test1;
- MatND hist_test2;
-
- /// Calculate the histograms for the HSV images
- calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false );
- normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );
+.. literalinclude:: ../../../../../samples/cpp/tutorial_code/Histograms_Matching/compareHist_Demo.cpp
+ :language: cpp
+ :tab-width: 4
- calcHist( &hsv_half_down, 1, channels, Mat(), hist_half_down, 2, histSize, ranges, true, false );
- normalize( hist_half_down, hist_half_down, 0, 1, NORM_MINMAX, -1, Mat() );
-
- calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false );
- normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );
-
- calcHist( &hsv_test2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false );
- normalize( hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat() );
-
- /// Apply the histogram comparison methods
- for( int i = 0; i < 4; i++ )
- { int compare_method = i;
- double base_base = compareHist( hist_base, hist_base, compare_method );
- double base_half = compareHist( hist_base, hist_half_down, compare_method );
- double base_test1 = compareHist( hist_base, hist_test1, compare_method );
- double base_test2 = compareHist( hist_base, hist_test2, compare_method );
-
- printf( " Method [%d] Perfect, Base-Half, Base-Test(1), Base-Test(2) : %f, %f, %f, %f \n", i, base_base, base_half , base_test1, base_test2 );
- }
-
- printf( "Done \n" );
-
- return 0;
- }
Explanation
@@ -211,11 +133,11 @@ Explanation
.. code-block:: cpp
- int h_bins = 50; int s_bins = 32;
+ int h_bins = 50; int s_bins = 60;
int histSize[] = { h_bins, s_bins };
- float h_ranges[] = { 0, 256 };
- float s_ranges[] = { 0, 180 };
+ float h_ranges[] = { 0, 180 };
+ float s_ranges[] = { 0, 256 };
const float* ranges[] = { h_ranges, s_ranges };
diff --git a/samples/cpp/tutorial_code/Histograms_Matching/compareHist_Demo.cpp b/samples/cpp/tutorial_code/Histograms_Matching/compareHist_Demo.cpp
index f4dd4e5e4e..424a38e93a 100644
--- a/samples/cpp/tutorial_code/Histograms_Matching/compareHist_Demo.cpp
+++ b/samples/cpp/tutorial_code/Histograms_Matching/compareHist_Demo.cpp
@@ -40,13 +40,13 @@ int main( int argc, char** argv )
hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );
- /// Using 30 bins for hue and 32 for saturation
+ /// Using 50 bins for hue and 60 for saturation
int h_bins = 50; int s_bins = 60;
int histSize[] = { h_bins, s_bins };
- // hue varies from 0 to 256, saturation from 0 to 180
- float s_ranges[] = { 0, 256 };
+ // hue varies from 0 to 179, saturation from 0 to 255
float h_ranges[] = { 0, 180 };
+ float s_ranges[] = { 0, 256 };
const float* ranges[] = { h_ranges, s_ranges };
From 6b8de222d770174fc1fb31b1b64da8995e8a8ebf Mon Sep 17 00:00:00 2001
From: Alexander Smorkalov
Date: Wed, 5 Mar 2014 09:57:16 +0400
Subject: [PATCH 019/117] OpenCV_MODULES_SUFFIX variable added to
OpenCVConfig.cmake to enable custom module configurations.
---
cmake/templates/OpenCVConfig.cmake.in | 28 +++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/cmake/templates/OpenCVConfig.cmake.in b/cmake/templates/OpenCVConfig.cmake.in
index 6db61d2112..3222048282 100644
--- a/cmake/templates/OpenCVConfig.cmake.in
+++ b/cmake/templates/OpenCVConfig.cmake.in
@@ -18,8 +18,8 @@
# This file will define the following variables:
# - OpenCV_LIBS : The list of all imported targets for OpenCV modules.
# - OpenCV_INCLUDE_DIRS : The OpenCV include directories.
-# - OpenCV_COMPUTE_CAPABILITIES : The version of compute capability
-# - OpenCV_ANDROID_NATIVE_API_LEVEL : Minimum required level of Android API
+# - OpenCV_COMPUTE_CAPABILITIES : The version of compute capability.
+# - OpenCV_ANDROID_NATIVE_API_LEVEL : Minimum required level of Android API.
# - OpenCV_VERSION : The version of this OpenCV build: "@OPENCV_VERSION@"
# - OpenCV_VERSION_MAJOR : Major version part of OpenCV_VERSION: "@OPENCV_VERSION_MAJOR@"
# - OpenCV_VERSION_MINOR : Minor version part of OpenCV_VERSION: "@OPENCV_VERSION_MINOR@"
@@ -27,22 +27,26 @@
# - OpenCV_VERSION_TWEAK : Tweak version part of OpenCV_VERSION: "@OPENCV_VERSION_TWEAK@"
#
# Advanced variables:
-# - OpenCV_SHARED
-# - OpenCV_CONFIG_PATH
-# - OpenCV_INSTALL_PATH (not set on Windows)
-# - OpenCV_LIB_COMPONENTS
-# - OpenCV_USE_MANGLED_PATHS
-# - OpenCV_HAVE_ANDROID_CAMERA
+# - OpenCV_SHARED : Use OpenCV as shared library
+# - OpenCV_CONFIG_PATH : Path to this OpenCVConfig.cmake
+# - OpenCV_INSTALL_PATH : OpenCV location (not set on Windows)
+# - OpenCV_LIB_COMPONENTS : Present OpenCV modules list
+# - OpenCV_USE_MANGLED_PATHS : Mangled OpenCV path flag
+# - OpenCV_MODULES_SUFFIX : The suffix for OpenCVModules-XXX.cmake file
+# - OpenCV_HAVE_ANDROID_CAMERA : Presence of Android native camera wrappers
#
# ===================================================================================
-set(modules_file_suffix "")
-if(ANDROID)
- string(REPLACE - _ modules_file_suffix "_${ANDROID_NDK_ABI_NAME}")
+if(NOT DEFINED OpenCV_MODULES_SUFFIX)
+ if(ANDROID)
+ string(REPLACE - _ OpenCV_MODULES_SUFFIX "_${ANDROID_NDK_ABI_NAME}")
+ else()
+ set(OpenCV_MODULES_SUFFIX "")
+ endif()
endif()
if(NOT TARGET opencv_core)
- include(${CMAKE_CURRENT_LIST_DIR}/OpenCVModules${modules_file_suffix}.cmake)
+ include(${CMAKE_CURRENT_LIST_DIR}/OpenCVModules${OpenCV_MODULES_SUFFIX}.cmake)
endif()
# TODO All things below should be reviewed. What is about of moving this code into related modules (special vars/hooks/files)
From 6890aa0033d0cc092fd8c829ce2cedf4c1f0c079 Mon Sep 17 00:00:00 2001
From: vbystricky
Date: Mon, 17 Mar 2014 16:03:15 +0400
Subject: [PATCH 020/117] Fix problems on Intel HD graphics
---
modules/video/src/lkpyramid.cpp | 2 --
modules/video/src/opencl/pyrlk.cl | 46 ++-----------------------------
2 files changed, 2 insertions(+), 46 deletions(-)
diff --git a/modules/video/src/lkpyramid.cpp b/modules/video/src/lkpyramid.cpp
index cd57585658..a33e47664d 100644
--- a/modules/video/src/lkpyramid.cpp
+++ b/modules/video/src/lkpyramid.cpp
@@ -975,9 +975,7 @@ namespace cv
idxArg = kernel.set(idxArg, imageI); //image2d_t I
idxArg = kernel.set(idxArg, imageJ); //image2d_t J
idxArg = kernel.set(idxArg, ocl::KernelArg::PtrReadOnly(prevPts)); // __global const float2* prevPts
- idxArg = kernel.set(idxArg, (int)prevPts.step); // int prevPtsStep
idxArg = kernel.set(idxArg, ocl::KernelArg::PtrReadWrite(nextPts)); // __global const float2* nextPts
- idxArg = kernel.set(idxArg, (int)nextPts.step); // int nextPtsStep
idxArg = kernel.set(idxArg, ocl::KernelArg::PtrReadWrite(status)); // __global uchar* status
idxArg = kernel.set(idxArg, ocl::KernelArg::PtrReadWrite(err)); // __global float* err
idxArg = kernel.set(idxArg, (int)level); // const int level
diff --git a/modules/video/src/opencl/pyrlk.cl b/modules/video/src/opencl/pyrlk.cl
index c018554902..822e628f25 100644
--- a/modules/video/src/opencl/pyrlk.cl
+++ b/modules/video/src/opencl/pyrlk.cl
@@ -262,50 +262,9 @@ inline void GetError(image2d_t J, const float x, const float y, const float* Pch
*errval += fabs(diff);
}
-inline void SetPatch4(image2d_t I, const float x, const float y,
- float4* Pch, float4* Dx, float4* Dy,
- float* A11, float* A12, float* A22)
-{
- *Pch = read_imagef(I, sampler, (float2)(x, y));
-
- float4 dIdx = 3.0f * read_imagef(I, sampler, (float2)(x + 1, y - 1)) + 10.0f * read_imagef(I, sampler, (float2)(x + 1, y)) + 3.0f * read_imagef(I, sampler, (float2)(x + 1, y + 1)) -
- (3.0f * read_imagef(I, sampler, (float2)(x - 1, y - 1)) + 10.0f * read_imagef(I, sampler, (float2)(x - 1, y)) + 3.0f * read_imagef(I, sampler, (float2)(x - 1, y + 1)));
-
- float4 dIdy = 3.0f * read_imagef(I, sampler, (float2)(x - 1, y + 1)) + 10.0f * read_imagef(I, sampler, (float2)(x, y + 1)) + 3.0f * read_imagef(I, sampler, (float2)(x + 1, y + 1)) -
- (3.0f * read_imagef(I, sampler, (float2)(x - 1, y - 1)) + 10.0f * read_imagef(I, sampler, (float2)(x, y - 1)) + 3.0f * read_imagef(I, sampler, (float2)(x + 1, y - 1)));
-
-
- *Dx = dIdx;
- *Dy = dIdy;
- float4 sqIdx = dIdx * dIdx;
- *A11 += sqIdx.x + sqIdx.y + sqIdx.z;
- sqIdx = dIdx * dIdy;
- *A12 += sqIdx.x + sqIdx.y + sqIdx.z;
- sqIdx = dIdy * dIdy;
- *A22 += sqIdx.x + sqIdx.y + sqIdx.z;
-}
-
-inline void GetPatch4(image2d_t J, const float x, const float y,
- const float4* Pch, const float4* Dx, const float4* Dy,
- float* b1, float* b2)
-{
- float4 J_val = read_imagef(J, sampler, (float2)(x, y));
- float4 diff = (J_val - *Pch) * 32.0f;
- float4 xdiff = diff* *Dx;
- *b1 += xdiff.x + xdiff.y + xdiff.z;
- xdiff = diff* *Dy;
- *b2 += xdiff.x + xdiff.y + xdiff.z;
-}
-
-inline void GetError4(image2d_t J, const float x, const float y, const float4* Pch, float* errval)
-{
- float4 diff = read_imagef(J, sampler, (float2)(x,y))-*Pch;
- *errval += fabs(diff.x) + fabs(diff.y) + fabs(diff.z);
-}
-
#define GRIDSIZE 3
__kernel void lkSparse(image2d_t I, image2d_t J,
- __global const float2* prevPts, int prevPtsStep, __global float2* nextPts, int nextPtsStep, __global uchar* status, __global float* err,
+ __global const float2* prevPts, __global float2* nextPts, __global uchar* status, __global float* err,
const int level, const int rows, const int cols, int PATCH_X, int PATCH_Y, int c_winSize_x, int c_winSize_y, int c_iters, char calcErr)
{
__local float smem1[BUFFER];
@@ -434,9 +393,8 @@ __kernel void lkSparse(image2d_t I, image2d_t J,
{
if (tid == 0 && level == 0)
status[gid] = 0;
- return;
+ break;
}
-
float b1 = 0;
float b2 = 0;
From 0c02e5de254d32e8f00bde4047f12624e77a7ef5 Mon Sep 17 00:00:00 2001
From: Anatoly Baksheev
Date: Mon, 17 Mar 2014 17:02:49 +0400
Subject: [PATCH 021/117] minor doc fix
---
modules/viz/doc/widget.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/viz/doc/widget.rst b/modules/viz/doc/widget.rst
index 7c1fc45751..0601ba1b72 100644
--- a/modules/viz/doc/widget.rst
+++ b/modules/viz/doc/widget.rst
@@ -1049,7 +1049,7 @@ viz::WWidgetMerger::WWidgetMerger
---------------------------------------
Constructs a WWidgetMerger.
-.. ocv:WWidgetMerger:: WWidgetMerger()
+.. ocv:function:: WWidgetMerger()
viz::WWidgetMerger::addCloud
-------------------------------
From 51cb6998ea1661b58a7ca267d6e0d6511ec63f6d Mon Sep 17 00:00:00 2001
From: yash
Date: Mon, 24 Feb 2014 18:28:55 +0530
Subject: [PATCH 022/117] made the example consistent with the fuction
definition and improved doc
made the example consistent with the fuction definition and improved doc
---
modules/core/doc/old_basic_structures.rst | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/modules/core/doc/old_basic_structures.rst b/modules/core/doc/old_basic_structures.rst
index c8de17adae..1d5880a624 100644
--- a/modules/core/doc/old_basic_structures.rst
+++ b/modules/core/doc/old_basic_structures.rst
@@ -1436,7 +1436,7 @@ description rewritten using
IplImage* color_img = cvCreateImage(cvSize(320,240), IPL_DEPTH_8U, 3);
IplImage gray_img_hdr, *gray_img;
- gray_img = (IplImage*)cvReshapeND(color_img, &gray_img_hdr, 1, 0, 0);
+ gray_img = (IplImage*)cvReshapeMatND(color_img, sizeof(gray_img_hdr), &gray_img_hdr, 1, 0, 0);
...
@@ -1444,6 +1444,18 @@ description rewritten using
int size[] = { 2, 2, 2 };
CvMatND* mat = cvCreateMatND(3, size, CV_32F);
CvMat row_header, *row;
+ row = (CvMat*)cvReshapeMatND(mat, sizeof(row_header), &row_header, 0, 1, 0);
+
+..
+
+In C, the header file for this function includes a convenient macro ``cvReshapeND`` that does away with the ``sizeof_header`` parameter. So, the lines containing the call to ``cvReshapeMatND`` in the examples may be replaced as follow:
+
+::
+
+ gray_img = (IplImage*)cvReshapeND(color_img, &gray_img_hdr, 1, 0, 0);
+
+ ...
+
row = (CvMat*)cvReshapeND(mat, &row_header, 0, 1, 0);
..
From 3940b6163b8370312d2a7fe66c96d43ab6d12efd Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Mon, 17 Mar 2014 18:52:28 +0400
Subject: [PATCH 023/117] remove intel guard since the code is 2 times faster
on AMD too
---
modules/ocl/perf/perf_filters.cpp | 6 +++---
modules/ocl/src/filtering.cpp | 6 +++---
modules/ocl/src/opencl/filtering_sep_filter_singlepass.cl | 2 ++
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/modules/ocl/perf/perf_filters.cpp b/modules/ocl/perf/perf_filters.cpp
index b3ffc51b30..c542d647cf 100644
--- a/modules/ocl/perf/perf_filters.cpp
+++ b/modules/ocl/perf/perf_filters.cpp
@@ -262,13 +262,13 @@ OCL_PERF_TEST_P(SobelFixture, Sobel,
oclDst.download(dst);
- SANITY_CHECK(dst);
+ SANITY_CHECK(dst, 1e-3);
}
else if (RUN_PLAIN_IMPL)
{
TEST_CYCLE() cv::Sobel(src, dst, -1, dx, dy);
- SANITY_CHECK(dst);
+ SANITY_CHECK(dst, 1e-3);
}
else
OCL_PERF_ELSE
@@ -326,7 +326,7 @@ OCL_PERF_TEST_P(GaussianBlurFixture, GaussianBlur,
Mat src(srcSize, type), dst(srcSize, type);
declare.in(src, WARMUP_RNG).out(dst);
- const double eps = src.depth() == CV_8U ? 1 + DBL_EPSILON : 3e-4;
+ const double eps = src.depth() == CV_8U ? 1 + DBL_EPSILON : 5e-4;
if (RUN_OCL_IMPL)
{
diff --git a/modules/ocl/src/filtering.cpp b/modules/ocl/src/filtering.cpp
index 35aa226de6..77052ffbf3 100644
--- a/modules/ocl/src/filtering.cpp
+++ b/modules/ocl/src/filtering.cpp
@@ -774,12 +774,12 @@ static void sepFilter2D_SinglePass(const oclMat &src, oclMat &dst,
option += " -D KERNEL_MATRIX_X=";
for(int i=0; i( &row_kernel.at(i) ) );
+ option += cv::format("DIG(0x%x)", *reinterpret_cast( &row_kernel.at(i) ) );
option += "0x0";
option += " -D KERNEL_MATRIX_Y=";
for(int i=0; i( &col_kernel.at(i) ) );
+ option += cv::format("DIG(0x%x)", *reinterpret_cast( &col_kernel.at(i) ) );
option += "0x0";
switch(src.type())
@@ -1410,7 +1410,7 @@ Ptr cv::ocl::createSeparableLinearFilter_GPU(int srcType, int
//if image size is non-degenerate and large enough
//and if filter support is reasonable to satisfy larger local memory requirements,
//then we can use single pass routine to avoid extra runtime calls overhead
- if( clCxt && clCxt->supportsFeature(FEATURE_CL_INTEL_DEVICE) &&
+ if( clCxt &&
rowKernel.rows <= 21 && columnKernel.rows <= 21 &&
(rowKernel.rows & 1) == 1 && (columnKernel.rows & 1) == 1 &&
imgSize.width > optimizedSepFilterLocalSize + (rowKernel.rows>>1) &&
diff --git a/modules/ocl/src/opencl/filtering_sep_filter_singlepass.cl b/modules/ocl/src/opencl/filtering_sep_filter_singlepass.cl
index c6555bff0f..c5f490284e 100644
--- a/modules/ocl/src/opencl/filtering_sep_filter_singlepass.cl
+++ b/modules/ocl/src/opencl/filtering_sep_filter_singlepass.cl
@@ -84,6 +84,8 @@
#define DST(_x,_y) (((global DSTTYPE*)(Dst+DstOffset+(_y)*DstPitch))[_x])
+#define DIG(a) a,
+
//horizontal and vertical filter kernels
//should be defined on host during compile time to avoid overhead
__constant uint mat_kernelX[] = {KERNEL_MATRIX_X};
From 82e6edfba28c91f80fbc20557a3f16906db95bc5 Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Mon, 17 Mar 2014 19:59:35 +0400
Subject: [PATCH 024/117] optimized sep filter
---
modules/core/include/opencv2/core/ocl.hpp | 2 +-
modules/core/src/ocl.cpp | 4 +-
modules/imgproc/perf/opencl/perf_filters.cpp | 2 +-
modules/imgproc/src/filter.cpp | 99 +++++++---
.../src/opencl/filterSep_singlePass.cl | 177 ++++++++++++++++++
5 files changed, 251 insertions(+), 33 deletions(-)
create mode 100644 modules/imgproc/src/opencl/filterSep_singlePass.cl
diff --git a/modules/core/include/opencv2/core/ocl.hpp b/modules/core/include/opencv2/core/ocl.hpp
index fb9ec24c56..fdb6f9a0aa 100644
--- a/modules/core/include/opencv2/core/ocl.hpp
+++ b/modules/core/include/opencv2/core/ocl.hpp
@@ -592,7 +592,7 @@ protected:
CV_EXPORTS const char* convertTypeStr(int sdepth, int ddepth, int cn, char* buf);
CV_EXPORTS const char* typeToStr(int t);
CV_EXPORTS const char* memopTypeToStr(int t);
-CV_EXPORTS String kernelToStr(InputArray _kernel, int ddepth = -1);
+CV_EXPORTS String kernelToStr(InputArray _kernel, int ddepth = -1, const char * name = NULL);
CV_EXPORTS void getPlatfomsInfo(std::vector& platform_info);
CV_EXPORTS int predictOptimalVectorWidth(InputArray src1, InputArray src2 = noArray(), InputArray src3 = noArray(),
InputArray src4 = noArray(), InputArray src5 = noArray(), InputArray src6 = noArray(),
diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp
index 7c4f8de9e0..b56f84c16e 100644
--- a/modules/core/src/ocl.cpp
+++ b/modules/core/src/ocl.cpp
@@ -4306,7 +4306,7 @@ static std::string kerToStr(const Mat & k)
return stream.str();
}
-String kernelToStr(InputArray _kernel, int ddepth)
+String kernelToStr(InputArray _kernel, int ddepth, const char * name)
{
Mat kernel = _kernel.getMat().reshape(1, 1);
@@ -4323,7 +4323,7 @@ String kernelToStr(InputArray _kernel, int ddepth)
const func_t func = funcs[depth];
CV_Assert(func != 0);
- return cv::format(" -D COEFF=%s", func(kernel).c_str());
+ return cv::format(" -D %s=%s", name ? name : "COEFF", func(kernel).c_str());
}
#define PROCESS_SRC(src) \
diff --git a/modules/imgproc/perf/opencl/perf_filters.cpp b/modules/imgproc/perf/opencl/perf_filters.cpp
index 57b928c289..f7329e3194 100644
--- a/modules/imgproc/perf/opencl/perf_filters.cpp
+++ b/modules/imgproc/perf/opencl/perf_filters.cpp
@@ -211,7 +211,7 @@ OCL_PERF_TEST_P(SobelFixture, Sobel,
OCL_TEST_CYCLE() cv::Sobel(src, dst, -1, dx, dy);
- SANITY_CHECK(dst);
+ SANITY_CHECK(dst, 1e-6);
}
///////////// Scharr ////////////////////////
diff --git a/modules/imgproc/src/filter.cpp b/modules/imgproc/src/filter.cpp
index ea0baf6b09..bb54471c07 100644
--- a/modules/imgproc/src/filter.cpp
+++ b/modules/imgproc/src/filter.cpp
@@ -3350,27 +3350,8 @@ static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor,
int radiusY = (int)((buf.rows - src.rows) >> 1);
bool isIsolatedBorder = (borderType & BORDER_ISOLATED) != 0;
- const char* btype = NULL;
- switch (borderType & ~BORDER_ISOLATED)
- {
- case BORDER_CONSTANT:
- btype = "BORDER_CONSTANT";
- break;
- case BORDER_REPLICATE:
- btype = "BORDER_REPLICATE";
- break;
- case BORDER_REFLECT:
- btype = "BORDER_REFLECT";
- break;
- case BORDER_WRAP:
- btype = "BORDER_WRAP";
- break;
- case BORDER_REFLECT101:
- btype = "BORDER_REFLECT_101";
- break;
- default:
- return false;
- }
+ const char * const borderMap[] = { "BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", "BORDER_WRAP", "BORDER_REFLECT_101" },
+ * const btype = borderMap[borderType & ~BORDER_ISOLATED];
bool extra_extrapolation = src.rows < (int)((-radiusY + globalsize[1]) >> 1) + 1;
extra_extrapolation |= src.rows < radiusY;
@@ -3463,36 +3444,96 @@ static bool ocl_sepColFilter2D(const UMat &buf, UMat &dst, Mat &kernelY, int anc
return kernelCol.run(2, globalsize, localsize, sync);
}
+const int optimizedSepFilterLocalSize = 16;
+
+static bool ocl_sepFilter2D_SinglePass(InputArray _src, OutputArray _dst,
+ InputArray _row_kernel, InputArray _col_kernel,
+ int borderType, int ddepth)
+{
+ Size size = _src.size(), wholeSize;
+ Point origin;
+ int stype = _src.type(), sdepth = CV_MAT_DEPTH(stype), cn = CV_MAT_CN(stype),
+ esz = CV_ELEM_SIZE(stype), wdepth = std::max(std::max(sdepth, ddepth), CV_32F),
+ dtype = CV_MAKE_TYPE(ddepth, cn);
+ size_t src_step = _src.step(), src_offset = _src.offset();
+ bool doubleSupport = ocl::Device::getDefault().doubleFPConfig() > 0;
+
+ if ((src_offset % src_step) % esz != 0 || (!doubleSupport && sdepth == CV_64F) ||
+ !(borderType == BORDER_CONSTANT || borderType == BORDER_REPLICATE ||
+ borderType == BORDER_REFLECT || borderType == BORDER_WRAP ||
+ borderType == BORDER_REFLECT_101))
+ return false;
+
+ size_t lt2[2] = { optimizedSepFilterLocalSize, optimizedSepFilterLocalSize };
+ size_t gt2[2] = { lt2[0] * (1 + (size.width - 1) / lt2[0]), lt2[1] * (1 + (size.height - 1) / lt2[1]) };
+
+ char cvt[2][40];
+ const char * const borderMap[] = { "BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", "BORDER_WRAP",
+ "BORDER_REFLECT_101" };
+
+ String opts = cv::format("-D BLK_X=%d -D BLK_Y=%d -D RADIUSX=%d -D RADIUSY=%d%s%s"
+ " -D srcT=%s -D convertToWT=%s -D WT=%s -D dstT=%s -D convertToDstT=%s"
+ " -D %s", (int)lt2[0], (int)lt2[1], _row_kernel.size().height / 2, _col_kernel.size().height / 2,
+ ocl::kernelToStr(_row_kernel, CV_32F, "KERNEL_MATRIX_X").c_str(),
+ ocl::kernelToStr(_col_kernel, CV_32F, "KERNEL_MATRIX_Y").c_str(),
+ ocl::typeToStr(stype), ocl::convertTypeStr(sdepth, wdepth, cn, cvt[0]),
+ ocl::typeToStr(CV_MAKE_TYPE(wdepth, cn)), ocl::typeToStr(dtype),
+ ocl::convertTypeStr(wdepth, ddepth, cn, cvt[1]), borderMap[borderType]);
+
+ ocl::Kernel k("sep_filter", ocl::imgproc::filterSep_singlePass_oclsrc, opts);
+ if (k.empty())
+ return false;
+
+ UMat src = _src.getUMat();
+ _dst.create(size, dtype);
+ UMat dst = _dst.getUMat();
+
+ int src_offset_x = static_cast((src_offset % src_step) / esz);
+ int src_offset_y = static_cast(src_offset / src_step);
+
+ src.locateROI(wholeSize, origin);
+
+ k.args(ocl::KernelArg::PtrReadOnly(src), (int)src_step, src_offset_x, src_offset_y,
+ wholeSize.height, wholeSize.width, ocl::KernelArg::WriteOnly(dst));
+
+ return k.run(2, gt2, lt2, false);
+}
+
static bool ocl_sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
InputArray _kernelX, InputArray _kernelY, Point anchor,
double delta, int borderType )
{
+ Size imgSize = _src.size();
+
if (abs(delta)> FLT_MIN)
return false;
- int type = _src.type();
+ int type = _src.type(), cn = CV_MAT_CN(type);
if ( !( (type == CV_8UC1 || type == CV_8UC4 || type == CV_32FC1 || type == CV_32FC4) &&
(ddepth == CV_32F || ddepth == CV_16S || ddepth == CV_8U || ddepth < 0) ) )
return false;
- int cn = CV_MAT_CN(type);
-
Mat kernelX = _kernelX.getMat().reshape(1, 1);
- if (1 != (kernelX.cols % 2))
+ if (kernelX.cols % 2 != 1)
return false;
Mat kernelY = _kernelY.getMat().reshape(1, 1);
- if (1 != (kernelY.cols % 2))
+ if (kernelY.cols % 2 != 1)
return false;
int sdepth = CV_MAT_DEPTH(type);
- if( anchor.x < 0 )
+ if (anchor.x < 0)
anchor.x = kernelX.cols >> 1;
- if( anchor.y < 0 )
+ if (anchor.y < 0)
anchor.y = kernelY.cols >> 1;
- if( ddepth < 0 )
+ if (ddepth < 0)
ddepth = sdepth;
+ CV_OCL_RUN_(kernelY.rows <= 21 && kernelX.rows <= 21 &&
+ imgSize.width > optimizedSepFilterLocalSize + (kernelX.rows >> 1) &&
+ imgSize.height > optimizedSepFilterLocalSize + (kernelY.rows >> 1),
+ ocl_sepFilter2D_SinglePass(_src, _dst, _kernelX, _kernelY, borderType, ddepth), true)
+
UMat src = _src.getUMat();
Size srcWholeSize; Point srcOffset;
src.locateROI(srcWholeSize, srcOffset);
diff --git a/modules/imgproc/src/opencl/filterSep_singlePass.cl b/modules/imgproc/src/opencl/filterSep_singlePass.cl
new file mode 100644
index 0000000000..7284da0cbc
--- /dev/null
+++ b/modules/imgproc/src/opencl/filterSep_singlePass.cl
@@ -0,0 +1,177 @@
+/*M///////////////////////////////////////////////////////////////////////////////////////
+//
+// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
+//
+// By downloading, copying, installing or using the software you agree to this license.
+// If you do not agree to this license, do not download, install,
+// copy or use the software.
+//
+//
+// License Agreement
+// For Open Source Computer Vision Library
+//
+// Copyright (C) 2014, Intel Corporation, all rights reserved.
+// Third party copyrights are property of their respective owners.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// * Redistribution's of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+//
+// * Redistribution's in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// * The name of the copyright holders may not be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// This software is provided by the copyright holders and contributors "as is" and
+// any express or implied warranties, including, but not limited to, the implied
+// warranties of merchantability and fitness for a particular purpose are disclaimed.
+// In no event shall the Intel Corporation or contributors be liable for any direct,
+// indirect, incidental, special, exemplary, or consequential damages
+// (including, but not limited to, procurement of substitute goods or services;
+// loss of use, data, or profits; or business interruption) however caused
+// and on any theory of liability, whether in contract, strict liability,
+// or tort (including negligence or otherwise) arising in any way out of
+// the use of this software, even if advised of the possibility of such damage.
+//
+//M*/
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////Macro for border type////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef BORDER_CONSTANT
+// CCCCCC|abcdefgh|CCCCCCC
+#define EXTRAPOLATE(x, maxV)
+#elif defined BORDER_REPLICATE
+// aaaaaa|abcdefgh|hhhhhhh
+#define EXTRAPOLATE(x, maxV) \
+ { \
+ (x) = max(min((x), (maxV) - 1), 0); \
+ }
+#elif defined BORDER_WRAP
+// cdefgh|abcdefgh|abcdefg
+#define EXTRAPOLATE(x, maxV) \
+ { \
+ (x) = ( (x) + (maxV) ) % (maxV); \
+ }
+#elif defined BORDER_REFLECT
+// fedcba|abcdefgh|hgfedcb
+#define EXTRAPOLATE(x, maxV) \
+ { \
+ (x) = min(((maxV)-1)*2-(x)+1, max((x),-(x)-1) ); \
+ }
+#elif defined BORDER_REFLECT_101 || defined BORDER_REFLECT101
+// gfedcb|abcdefgh|gfedcba
+#define EXTRAPOLATE(x, maxV) \
+ { \
+ (x) = min(((maxV)-1)*2-(x), max((x),-(x)) ); \
+ }
+#else
+#error No extrapolation method
+#endif
+
+#define SRC(_x,_y) convertToWT(((global srcT*)(Src+(_y)*src_step))[_x])
+
+#ifdef BORDER_CONSTANT
+// CCCCCC|abcdefgh|CCCCCCC
+#define ELEM(_x,_y,r_edge,t_edge,const_v) (_x)<0 | (_x) >= (r_edge) | (_y)<0 | (_y) >= (t_edge) ? (const_v) : SRC((_x),(_y))
+#else
+#define ELEM(_x,_y,r_edge,t_edge,const_v) SRC((_x),(_y))
+#endif
+
+#define DST(_x,_y) (((global dstT*)(Dst+dst_offset+(_y)*dst_step))[_x])
+
+#define noconvert
+
+// horizontal and vertical filter kernels
+// should be defined on host during compile time to avoid overhead
+#define DIG(a) a,
+__constant float mat_kernelX[] = { KERNEL_MATRIX_X };
+__constant float mat_kernelY[] = { KERNEL_MATRIX_Y };
+
+__kernel void sep_filter(__global uchar* Src, int src_step, int srcOffsetX, int srcOffsetY, int height, int width,
+ __global uchar* Dst, int dst_step, int dst_offset, int dst_rows, int dst_cols)
+{
+ // RADIUSX, RADIUSY are filter dimensions
+ // BLK_X, BLK_Y are local wrogroup sizes
+ // all these should be defined on host during compile time
+ // first lsmem array for source pixels used in first pass,
+ // second lsmemDy for storing first pass results
+ __local WT lsmem[BLK_Y+2*RADIUSY][BLK_X+2*RADIUSX];
+ __local WT lsmemDy[BLK_Y][BLK_X+2*RADIUSX];
+
+ // get local and global ids - used as image and local memory array indexes
+ int lix = get_local_id(0);
+ int liy = get_local_id(1);
+
+ int x = (int)get_global_id(0);
+ int y = (int)get_global_id(1);
+
+ // calculate pixel position in source image taking image offset into account
+ int srcX = x + srcOffsetX - RADIUSX;
+ int srcY = y + srcOffsetY - RADIUSY;
+ int xb = srcX;
+ int yb = srcY;
+
+ // extrapolate coordinates, if needed
+ // and read my own source pixel into local memory
+ // with account for extra border pixels, which will be read by starting workitems
+ int clocY = liy;
+ int cSrcY = srcY;
+ do
+ {
+ int yb = cSrcY;
+ EXTRAPOLATE(yb, (height));
+
+ int clocX = lix;
+ int cSrcX = srcX;
+ do
+ {
+ int xb = cSrcX;
+ EXTRAPOLATE(xb,(width));
+ lsmem[clocY][clocX] = ELEM(xb, yb, (width), (height), 0 );
+
+ clocX += BLK_X;
+ cSrcX += BLK_X;
+ }
+ while(clocX < BLK_X+(RADIUSX*2));
+
+ clocY += BLK_Y;
+ cSrcY += BLK_Y;
+ }
+ while (clocY < BLK_Y+(RADIUSY*2));
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ // do vertical filter pass
+ // and store intermediate results to second local memory array
+ int i, clocX = lix;
+ WT sum = 0.0f;
+ do
+ {
+ sum = 0.0f;
+ for (i=0; i<=2*RADIUSY; i++)
+ sum = mad(lsmem[liy+i][clocX], mat_kernelY[i], sum);
+ lsmemDy[liy][clocX] = sum;
+ clocX += BLK_X;
+ }
+ while(clocX < BLK_X+(RADIUSX*2));
+ barrier(CLK_LOCAL_MEM_FENCE);
+
+ // if this pixel happened to be out of image borders because of global size rounding,
+ // then just return
+ if( x >= dst_cols || y >=dst_rows )
+ return;
+
+ // do second horizontal filter pass
+ // and calculate final result
+ sum = 0.0f;
+ for (i=0; i<=2*RADIUSX; i++)
+ sum = mad(lsmemDy[liy][lix+i], mat_kernelX[i], sum);
+
+ //store result into destination image
+ DST(x,y) = convertToDstT(sum);
+}
From b9cdde69911289b45c3686d2eee223f814380c97 Mon Sep 17 00:00:00 2001
From: yash
Date: Tue, 18 Mar 2014 08:44:33 +0530
Subject: [PATCH 025/117] edited sample code for mean/cam sihft and fixed an
error
---
doc/py_tutorials/py_video/py_meanshift/py_meanshift.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/doc/py_tutorials/py_video/py_meanshift/py_meanshift.rst b/doc/py_tutorials/py_video/py_meanshift/py_meanshift.rst
index a111311af3..87ece69350 100644
--- a/doc/py_tutorials/py_video/py_meanshift/py_meanshift.rst
+++ b/doc/py_tutorials/py_video/py_meanshift/py_meanshift.rst
@@ -52,7 +52,7 @@ To use meanshift in OpenCV, first we need to setup the target, find its histogra
# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
- hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
+ hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)
@@ -127,7 +127,7 @@ It is almost same as meanshift, but it returns a rotated rectangle (that is our
# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
- hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
+ hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)
From 16869225ffb6029cea0f694b8ee9ffab2eb835bd Mon Sep 17 00:00:00 2001
From: RJ2
Date: Tue, 18 Mar 2014 08:01:18 +0100
Subject: [PATCH 026/117] It's will be better
---
doc/tutorials/core/adding_images/adding_images.rst | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/doc/tutorials/core/adding_images/adding_images.rst b/doc/tutorials/core/adding_images/adding_images.rst
index e3135693de..601dbc07ef 100644
--- a/doc/tutorials/core/adding_images/adding_images.rst
+++ b/doc/tutorials/core/adding_images/adding_images.rst
@@ -6,12 +6,12 @@ Adding (blending) two images using OpenCV
Goal
=====
-In this tutorial you will learn how to:
+In this tutorial you will learn:
.. container:: enumeratevisibleitemswithsquare
- * What is *linear blending* and why it is useful.
- * Add two images using :add_weighted:`addWeighted <>`
+ * what is *linear blending* and why it is useful;
+ * how to add two images using :add_weighted:`addWeighted <>`
Theory
=======
From 0470bb0e2958ae9725465fe6ab2767f19c5009fa Mon Sep 17 00:00:00 2001
From: RJ2
Date: Tue, 18 Mar 2014 08:59:53 +0100
Subject: [PATCH 027/117] I have changed one sentence in tutorial, making it
more understandable
---
doc/tutorials/core/how_to_scan_images/how_to_scan_images.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/tutorials/core/how_to_scan_images/how_to_scan_images.rst b/doc/tutorials/core/how_to_scan_images/how_to_scan_images.rst
index ef0f8640ca..b6a18fee88 100644
--- a/doc/tutorials/core/how_to_scan_images/how_to_scan_images.rst
+++ b/doc/tutorials/core/how_to_scan_images/how_to_scan_images.rst
@@ -18,7 +18,7 @@ We'll seek answers for the following questions:
Our test case
=============
-Let us consider a simple color reduction method. Using the unsigned char C and C++ type for matrix item storing a channel of pixel may have up to 256 different values. For a three channel image this can allow the formation of way too many colors (16 million to be exact). Working with so many color shades may give a heavy blow to our algorithm performance. However, sometimes it is enough to work with a lot less of them to get the same final result.
+Let us consider a simple color reduction method. By using the unsigned char C and C++ type for matrix item storing, a channel of pixel may have up to 256 different values. For a three channel image this can allow the formation of way too many colors (16 million to be exact). Working with so many color shades may give a heavy blow to our algorithm performance. However, sometimes it is enough to work with a lot less of them to get the same final result.
In this cases it's common that we make a *color space reduction*. This means that we divide the color space current value with a new input value to end up with fewer colors. For instance every value between zero and nine takes the new value zero, every value between ten and nineteen the value ten and so on.
From eebf92ba58f68a7fc0f05c6e37d6e4fb111de151 Mon Sep 17 00:00:00 2001
From: Konstantin Matskevich
Date: Tue, 18 Mar 2014 13:19:41 +0400
Subject: [PATCH 028/117] fix for incorrect opencl device selection
---
modules/core/src/ocl.cpp | 5 +++--
modules/core/src/umatrix.cpp | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp
index 7c4f8de9e0..b8f9db5fb4 100644
--- a/modules/core/src/ocl.cpp
+++ b/modules/core/src/ocl.cpp
@@ -1410,7 +1410,7 @@ bool useOpenCL()
{
CoreTLSData* data = coreTlsData.get();
if( data->useOpenCL < 0 )
- data->useOpenCL = (int)haveOpenCL();
+ data->useOpenCL = (int)haveOpenCL() && Device::getDefault().ptr() != NULL;
return data->useOpenCL > 0;
}
@@ -1419,7 +1419,7 @@ void setUseOpenCL(bool flag)
if( haveOpenCL() )
{
CoreTLSData* data = coreTlsData.get();
- data->useOpenCL = flag ? 1 : 0;
+ data->useOpenCL = (flag && Device::getDefault().ptr() != NULL) ? 1 : 0;
}
}
@@ -2245,6 +2245,7 @@ not_found:
std::cerr << deviceTypes[t] << " ";
std::cerr << std::endl << " Device name: " << (deviceName.length() == 0 ? "any" : deviceName) << std::endl;
+ throw cv::Exception();
return NULL;
}
diff --git a/modules/core/src/umatrix.cpp b/modules/core/src/umatrix.cpp
index 44cb3f44b5..d88dda2730 100644
--- a/modules/core/src/umatrix.cpp
+++ b/modules/core/src/umatrix.cpp
@@ -88,7 +88,7 @@ void UMatData::unlock()
MatAllocator* UMat::getStdAllocator()
{
- if( ocl::haveOpenCL() )
+ if( ocl::haveOpenCL() && ocl::useOpenCL() )
return ocl::getOpenCLAllocator();
return Mat::getStdAllocator();
}
From b4e4f13f9efdfe2d1f0909d78556d8c865d5f371 Mon Sep 17 00:00:00 2001
From: Alexander Smorkalov
Date: Wed, 5 Mar 2014 12:31:04 +0400
Subject: [PATCH 029/117] Superres module enabled for Android. GPU samples
build fixed for Android.
---
cmake/OpenCVModule.cmake | 66 +++++++++-----------
modules/superres/CMakeLists.txt | 9 ++-
modules/superres/src/btv_l1_gpu.cpp | 2 +-
modules/superres/src/frame_source.cpp | 2 +-
modules/superres/src/input_array_utility.cpp | 2 +-
modules/superres/src/optical_flow.cpp | 2 +-
modules/superres/src/precomp.hpp | 2 +-
modules/ts/CMakeLists.txt | 2 +-
samples/gpu/CMakeLists.txt | 2 +-
samples/gpu/brox_optical_flow.cpp | 1 +
samples/gpu/opticalflow_nvidia_api.cpp | 1 +
samples/gpu/super_resolution.cpp | 2 +
12 files changed, 49 insertions(+), 44 deletions(-)
diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake
index c9c351113c..e11f5e671f 100644
--- a/cmake/OpenCVModule.cmake
+++ b/cmake/OpenCVModule.cmake
@@ -27,7 +27,8 @@
# The verbose template for OpenCV module:
#
# ocv_add_module(modname )
-# ocv_glob_module_sources() or glob them manually and ocv_set_module_sources(...)
+# ocv_glob_module_sources(([EXCLUDE_CUDA] )
+# or glob them manually and ocv_set_module_sources(...)
# ocv_module_include_directories()
# ocv_create_module()
#
@@ -478,14 +479,20 @@ endmacro()
# finds and sets headers and sources for the standard OpenCV module
# Usage:
-# ocv_glob_module_sources()
-macro(ocv_glob_module_sources EXCLUDE_CUDA EXCLUDE_OPENCL)
+# ocv_glob_module_sources([EXCLUDE_CUDA] )
+macro(ocv_glob_module_sources)
+ set(_argn ${ARGN})
+ list(FIND _argn "EXCLUDE_CUDA" exclude_cuda)
+ if(NOT exclude_cuda EQUAL -1)
+ list(REMOVE_AT _argn ${exclude_cuda})
+ endif()
+
file(GLOB_RECURSE lib_srcs "src/*.cpp")
file(GLOB_RECURSE lib_int_hdrs "src/*.hpp" "src/*.h")
file(GLOB lib_hdrs "include/opencv2/${name}/*.hpp" "include/opencv2/${name}/*.h")
file(GLOB lib_hdrs_detail "include/opencv2/${name}/detail/*.hpp" "include/opencv2/${name}/detail/*.h")
- if (NOT ${EXCLUDE_CUDA})
+ if (exclude_cuda EQUAL -1)
file(GLOB lib_cuda_srcs "src/cuda/*.cu")
set(cuda_objs "")
set(lib_cuda_hdrs "")
@@ -504,26 +511,22 @@ macro(ocv_glob_module_sources EXCLUDE_CUDA EXCLUDE_OPENCL)
source_group("Src" FILES ${lib_srcs} ${lib_int_hdrs})
- if (NOT ${EXCLUDE_OPENCL})
- file(GLOB cl_kernels "src/opencl/*.cl")
- if(HAVE_opencv_ocl AND cl_kernels)
- ocv_include_directories(${OPENCL_INCLUDE_DIRS})
- add_custom_command(
- OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp"
- COMMAND ${CMAKE_COMMAND} -DCL_DIR="${CMAKE_CURRENT_SOURCE_DIR}/src/opencl" -DOUTPUT="${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" -P "${OpenCV_SOURCE_DIR}/cmake/cl2cpp.cmake"
- DEPENDS ${cl_kernels} "${OpenCV_SOURCE_DIR}/cmake/cl2cpp.cmake")
- source_group("OpenCL" FILES ${cl_kernels} "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp")
- list(APPEND lib_srcs ${cl_kernels} "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp")
- endif()
+ file(GLOB cl_kernels "src/opencl/*.cl")
+ if(HAVE_opencv_ocl AND cl_kernels)
+ ocv_include_directories(${OPENCL_INCLUDE_DIRS})
+ add_custom_command(
+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp"
+ COMMAND ${CMAKE_COMMAND} -DCL_DIR="${CMAKE_CURRENT_SOURCE_DIR}/src/opencl" -DOUTPUT="${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" -P "${OpenCV_SOURCE_DIR}/cmake/cl2cpp.cmake"
+ DEPENDS ${cl_kernels} "${OpenCV_SOURCE_DIR}/cmake/cl2cpp.cmake")
+ source_group("OpenCL" FILES ${cl_kernels} "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp")
+ list(APPEND lib_srcs ${cl_kernels} "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.cpp" "${CMAKE_CURRENT_BINARY_DIR}/opencl_kernels.hpp")
endif()
source_group("Include" FILES ${lib_hdrs})
source_group("Include\\detail" FILES ${lib_hdrs_detail})
- message(":${EXCLUDE_CUDA}: ${lib_cuda_srcs}")
-
- ocv_set_module_sources(${ARGN} HEADERS ${lib_hdrs} ${lib_hdrs_detail}
- SOURCES ${lib_srcs} ${lib_int_hdrs} ${cuda_objs} ${lib_cuda_srcs} ${lib_cuda_hdrs})
+ ocv_set_module_sources(${_argn} HEADERS ${lib_hdrs} ${lib_hdrs_detail}
+ SOURCES ${lib_srcs} ${lib_int_hdrs} ${cuda_objs} ${lib_cuda_srcs} ${lib_cuda_hdrs})
endmacro()
# creates OpenCV module in current folder
@@ -622,27 +625,20 @@ endmacro()
# short command for adding simple OpenCV module
# see ocv_add_module for argument details
# Usage:
-# ocv_define_module(module_name [INTERNAL] [REQUIRED] [] [OPTIONAL ])
+# ocv_define_module(module_name [INTERNAL] [EXCLUDE_CUDA] [REQUIRED] [] [OPTIONAL ])
macro(ocv_define_module module_name)
- set(_tmp_argn ${ARGN})
- set(exclude_cuda 0)
- set(exclude_opencl 0)
- set(argv0 ${ARGV1})
- set(argv1 ${ARGV2})
- set(argv2 ${ARGV3})
- foreach(i RANGE 0 2)
- if("${argv${i}}" STREQUAL "EXCLUDE_CUDA")
- set(exclude_cuda 1)
- list(REMOVE_AT _tmp_argn ${i})
- elseif ("${argv${i}}" STREQUAL "EXCLUDE_OPENCL")
- set(exclude_opencl 1)
- list(REMOVE_AT _tmp_argn ${i})
+ set(_argn ${ARGN})
+ set(exclude_cuda "")
+ foreach(arg ${_argn})
+ if("${arg}" STREQUAL "EXCLUDE_CUDA")
+ set(exclude_cuda "${arg}")
+ list(REMOVE_ITEM _argn ${arg})
endif()
endforeach()
- ocv_add_module(${module_name} ${_tmp_argn})
+ ocv_add_module(${module_name} ${_argn})
ocv_module_include_directories()
- ocv_glob_module_sources(${exclude_cuda} ${exclude_opencl})
+ ocv_glob_module_sources(${exclude_cuda})
ocv_create_module()
ocv_add_precompiled_headers(${the_module})
diff --git a/modules/superres/CMakeLists.txt b/modules/superres/CMakeLists.txt
index 82c61cccb4..8e3d7b2f2d 100644
--- a/modules/superres/CMakeLists.txt
+++ b/modules/superres/CMakeLists.txt
@@ -1,7 +1,12 @@
-if(ANDROID OR IOS)
+if(IOS)
ocv_module_disable(superres)
endif()
set(the_description "Super Resolution")
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127 -Wundef -Wshadow)
-ocv_define_module(superres opencv_imgproc opencv_video OPTIONAL opencv_gpu opencv_highgui opencv_ocl ${CUDA_LIBRARIES} ${CUDA_npp_LIBRARY})
+if(ENABLE_DYNAMIC_CUDA)
+ add_definitions(-DDYNAMIC_CUDA_SUPPORT)
+ ocv_define_module(superres EXCLUDE_CUDA opencv_imgproc opencv_video OPTIONAL opencv_highgui opencv_ocl)
+else()
+ ocv_define_module(superres opencv_imgproc opencv_video OPTIONAL opencv_gpu opencv_highgui opencv_ocl ${CUDA_LIBRARIES} ${CUDA_npp_LIBRARY})
+endif()
diff --git a/modules/superres/src/btv_l1_gpu.cpp b/modules/superres/src/btv_l1_gpu.cpp
index b93bcfd577..2f40fa3771 100644
--- a/modules/superres/src/btv_l1_gpu.cpp
+++ b/modules/superres/src/btv_l1_gpu.cpp
@@ -51,7 +51,7 @@ using namespace cv::gpu;
using namespace cv::superres;
using namespace cv::superres::detail;
-#if !defined(HAVE_CUDA) || !defined(HAVE_OPENCV_GPU)
+#if !defined(HAVE_CUDA) || !defined(HAVE_OPENCV_GPU) || defined(DYNAMIC_CUDA_SUPPORT)
Ptr cv::superres::createSuperResolution_BTVL1_GPU()
{
diff --git a/modules/superres/src/frame_source.cpp b/modules/superres/src/frame_source.cpp
index 20e45d9518..5f59a98b80 100644
--- a/modules/superres/src/frame_source.cpp
+++ b/modules/superres/src/frame_source.cpp
@@ -200,7 +200,7 @@ Ptr cv::superres::createFrameSource_Camera(int deviceId)
//////////////////////////////////////////////////////
// VideoFrameSource_GPU
-#ifndef HAVE_OPENCV_GPU
+#if !defined(HAVE_OPENCV_GPU) || defined(DYNAMIC_CUDA_SUPPORT)
Ptr cv::superres::createFrameSource_Video_GPU(const string& fileName)
{
diff --git a/modules/superres/src/input_array_utility.cpp b/modules/superres/src/input_array_utility.cpp
index 075cf95144..10fc1c96ed 100644
--- a/modules/superres/src/input_array_utility.cpp
+++ b/modules/superres/src/input_array_utility.cpp
@@ -207,7 +207,7 @@ namespace
switch (src.kind())
{
case _InputArray::GPU_MAT:
- #ifdef HAVE_OPENCV_GPU
+ #if defined(HAVE_OPENCV_GPU) && !defined(DYNAMIC_CUDA_SUPPORT)
gpu::cvtColor(src.getGpuMat(), dst.getGpuMatRef(), code, cn);
#else
CV_Error(CV_StsNotImplemented, "The called functionality is disabled for current build or platform");
diff --git a/modules/superres/src/optical_flow.cpp b/modules/superres/src/optical_flow.cpp
index e1e8a10275..617f83a5e1 100644
--- a/modules/superres/src/optical_flow.cpp
+++ b/modules/superres/src/optical_flow.cpp
@@ -344,7 +344,7 @@ Ptr cv::superres::createOptFlow_DualTVL1()
///////////////////////////////////////////////////////////////////
// GpuOpticalFlow
-#ifndef HAVE_OPENCV_GPU
+#if !defined(HAVE_OPENCV_GPU) || defined(DYNAMIC_CUDA_SUPPORT)
Ptr cv::superres::createOptFlow_Farneback_GPU()
{
diff --git a/modules/superres/src/precomp.hpp b/modules/superres/src/precomp.hpp
index 4cf49411b6..65fc7c8502 100644
--- a/modules/superres/src/precomp.hpp
+++ b/modules/superres/src/precomp.hpp
@@ -56,7 +56,7 @@
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/tracking.hpp"
-#ifdef HAVE_OPENCV_GPU
+#if defined(HAVE_OPENCV_GPU) && !defined(DYNAMIC_CUDA_SUPPORT)
#include "opencv2/gpu/gpu.hpp"
#ifdef HAVE_CUDA
#include "opencv2/gpu/stream_accessor.hpp"
diff --git a/modules/ts/CMakeLists.txt b/modules/ts/CMakeLists.txt
index dcd3e1563b..bb56da2d98 100644
--- a/modules/ts/CMakeLists.txt
+++ b/modules/ts/CMakeLists.txt
@@ -11,7 +11,7 @@ ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef)
ocv_add_module(ts opencv_core opencv_features2d)
-ocv_glob_module_sources(0 0)
+ocv_glob_module_sources()
ocv_module_include_directories()
ocv_create_module()
diff --git a/samples/gpu/CMakeLists.txt b/samples/gpu/CMakeLists.txt
index 8fa539473b..d25c3a6b5d 100644
--- a/samples/gpu/CMakeLists.txt
+++ b/samples/gpu/CMakeLists.txt
@@ -41,7 +41,7 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND)
target_link_libraries(${the_target} ${OPENCV_LINKER_LIBS} ${OPENCV_GPU_SAMPLES_REQUIRED_DEPS})
- if(HAVE_CUDA)
+ if(HAVE_CUDA AND NOT ANDROID)
target_link_libraries(${the_target} ${CUDA_CUDA_LIBRARY})
endif()
diff --git a/samples/gpu/brox_optical_flow.cpp b/samples/gpu/brox_optical_flow.cpp
index 722e19f02f..7cd5089b41 100644
--- a/samples/gpu/brox_optical_flow.cpp
+++ b/samples/gpu/brox_optical_flow.cpp
@@ -1,6 +1,7 @@
#include
#include
#include
+#include
#include "cvconfig.h"
#include "opencv2/core/core.hpp"
diff --git a/samples/gpu/opticalflow_nvidia_api.cpp b/samples/gpu/opticalflow_nvidia_api.cpp
index 05a37ef69d..31ee569788 100644
--- a/samples/gpu/opticalflow_nvidia_api.cpp
+++ b/samples/gpu/opticalflow_nvidia_api.cpp
@@ -7,6 +7,7 @@
#include
#include
#include
+#include
#include "cvconfig.h"
#include
diff --git a/samples/gpu/super_resolution.cpp b/samples/gpu/super_resolution.cpp
index 6efd24144c..85cb6cff1c 100644
--- a/samples/gpu/super_resolution.cpp
+++ b/samples/gpu/super_resolution.cpp
@@ -1,6 +1,8 @@
#include
#include
#include
+#include
+
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
From a43ef9a6cd63275cca73963065c8f20b4806c83d Mon Sep 17 00:00:00 2001
From: Koji Miyazato
Date: Tue, 18 Mar 2014 23:29:30 +0900
Subject: [PATCH 030/117] WriteStructContext treats state of fs
---
.../core/include/opencv2/core/persistence.hpp | 3 +--
modules/core/src/persistence.cpp | 17 +++++++++++++++++
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/modules/core/include/opencv2/core/persistence.hpp b/modules/core/include/opencv2/core/persistence.hpp
index e00c849400..93f7381bfa 100644
--- a/modules/core/include/opencv2/core/persistence.hpp
+++ b/modules/core/include/opencv2/core/persistence.hpp
@@ -697,9 +697,8 @@ void write(FileStorage& fs, const String& name, const Range& r )
template static inline
void write( FileStorage& fs, const String& name, const std::vector<_Tp>& vec )
{
- fs << (DataType<_Tp>::fmt != 0 ? "[:" : "[");
+ internal::WriteStructContext ws(fs, name, FileNode::SEQ+(DataType<_Tp>::fmt != 0 ? FileNode::FLOW : 0));
write(fs, vec);
- fs << "]";
}
static inline
diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp
index 3755eccf75..af6a23cd17 100644
--- a/modules/core/src/persistence.cpp
+++ b/modules/core/src/persistence.cpp
@@ -5486,11 +5486,28 @@ internal::WriteStructContext::WriteStructContext(FileStorage& _fs,
{
cvStartWriteStruct(**fs, !name.empty() ? name.c_str() : 0, flags,
!typeName.empty() ? typeName.c_str() : 0);
+ if ((flags & FileNode::TYPE_MASK) == FileNode::SEQ)
+ {
+ fs->elname = String();
+ fs->state = FileStorage::VALUE_EXPECTED;
+ fs->structs.push_back('[');
+ }
+ else
+ {
+ fs->elname = String();
+ fs->state = FileStorage::NAME_EXPECTED + FileStorage::INSIDE_MAP;
+ fs->structs.push_back('{');
+ }
}
internal::WriteStructContext::~WriteStructContext()
{
cvEndWriteStruct(**fs);
+ fs->structs.pop_back();
+ fs->state = fs->structs.empty() || fs->structs.back() == '{' ?
+ FileStorage::NAME_EXPECTED + FileStorage::INSIDE_MAP :
+ FileStorage::VALUE_EXPECTED;
+ fs->elname = String();
}
From 0a16d93e1d2b8c23df77c769589cfc7982c68af1 Mon Sep 17 00:00:00 2001
From: Firat Kalaycilar
Date: Tue, 18 Mar 2014 17:26:24 +0200
Subject: [PATCH 031/117] Fixed an issue with weight assignment causing the
resulting GMM weights to be unsorted in the CUDA and OCL versions of
BackgroundSubtractorMOG2
---
modules/gpu/src/cuda/bgfg_mog.cu | 5 +++--
modules/ocl/src/opencl/bgfg_mog.cl | 5 +++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/modules/gpu/src/cuda/bgfg_mog.cu b/modules/gpu/src/cuda/bgfg_mog.cu
index 89ad5ff0b5..055c9e041e 100644
--- a/modules/gpu/src/cuda/bgfg_mog.cu
+++ b/modules/gpu/src/cuda/bgfg_mog.cu
@@ -489,7 +489,7 @@ namespace cv { namespace gpu { namespace device
{
//need only weight if fit is found
float weight = alpha1 * gmm_weight(mode * frame.rows + y, x) + prune;
-
+ int swap_count = 0;
//fit not found yet
if (!fitsPDF)
{
@@ -540,6 +540,7 @@ namespace cv { namespace gpu { namespace device
if (weight < gmm_weight((i - 1) * frame.rows + y, x))
break;
+ swap_count++;
//swap one up
swap(gmm_weight, x, y, i - 1, frame.rows);
swap(gmm_variance, x, y, i - 1, frame.rows);
@@ -557,7 +558,7 @@ namespace cv { namespace gpu { namespace device
nmodes--;
}
- gmm_weight(mode * frame.rows + y, x) = weight; //update weight by the calculated value
+ gmm_weight((mode - swap_count) * frame.rows + y, x) = weight; //update weight by the calculated value
totalWeight += weight;
}
diff --git a/modules/ocl/src/opencl/bgfg_mog.cl b/modules/ocl/src/opencl/bgfg_mog.cl
index 6a95316f0f..a7479b929c 100644
--- a/modules/ocl/src/opencl/bgfg_mog.cl
+++ b/modules/ocl/src/opencl/bgfg_mog.cl
@@ -376,7 +376,7 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob
for (int mode = 0; mode < nmodes; ++mode)
{
float _weight = alpha1 * weight[(mode * frame_row + y) * weight_step + x] + prune;
-
+ int swap_count = 0;
if (!fitsPDF)
{
float var = variance[(mode * frame_row + y) * var_step + x];
@@ -404,6 +404,7 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob
{
if (_weight < weight[((i - 1) * frame_row + y) * weight_step + x])
break;
+ swap_count++;
swap(weight, x, y, i - 1, frame_row, weight_step);
swap(variance, x, y, i - 1, frame_row, var_step);
#if defined (CN1)
@@ -421,7 +422,7 @@ __kernel void mog2_kernel(__global T_FRAME * frame, __global int* fgmask, __glob
nmodes--;
}
- weight[(mode * frame_row + y) * weight_step + x] = _weight; //update weight by the calculated value
+ weight[((mode - swap_count) * frame_row + y) * weight_step + x] = _weight; //update weight by the calculated value
totalWeight += _weight;
}
From 8d97d0d6313d6e1e60ff91ad088e4a69a52bd1a5 Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Tue, 18 Mar 2014 19:31:37 +0400
Subject: [PATCH 032/117] added 3-channels support to cv::flip
---
modules/core/src/copy.cpp | 7 +++--
modules/core/src/opencl/flip.cl | 55 ++++++++++++++++-----------------
2 files changed, 31 insertions(+), 31 deletions(-)
diff --git a/modules/core/src/copy.cpp b/modules/core/src/copy.cpp
index e3e959c950..5ac5f22c58 100644
--- a/modules/core/src/copy.cpp
+++ b/modules/core/src/copy.cpp
@@ -482,9 +482,9 @@ enum { FLIP_COLS = 1 << 0, FLIP_ROWS = 1 << 1, FLIP_BOTH = FLIP_ROWS | FLIP_COLS
static bool ocl_flip(InputArray _src, OutputArray _dst, int flipCode )
{
CV_Assert(flipCode >= - 1 && flipCode <= 1);
- int type = _src.type(), cn = CV_MAT_CN(type), flipType;
+ int type = _src.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type), flipType;
- if (cn > 4 || cn == 3)
+ if (cn > 4)
return false;
const char * kernelName;
@@ -506,7 +506,8 @@ static bool ocl_flip(InputArray _src, OutputArray _dst, int flipCode )
}
ocl::Kernel k(kernelName, ocl::core::flip_oclsrc,
- format( "-D type=%s", ocl::memopTypeToStr(type)));
+ format( "-D T=%s -D T1=%s -D cn=%d", ocl::memopTypeToStr(type),
+ ocl::memopTypeToStr(depth), cn));
if (k.empty())
return false;
diff --git a/modules/core/src/opencl/flip.cl b/modules/core/src/opencl/flip.cl
index 0c874dbe6f..bacfe7adfb 100644
--- a/modules/core/src/opencl/flip.cl
+++ b/modules/core/src/opencl/flip.cl
@@ -39,10 +39,18 @@
//
//M*/
-#define sizeoftype ((int)sizeof(type))
+#if cn != 3
+#define loadpix(addr) *(__global const T *)(addr)
+#define storepix(val, addr) *(__global T *)(addr) = val
+#define TSIZE (int)sizeof(T)
+#else
+#define loadpix(addr) vload3(0, (__global const T1 *)(addr))
+#define storepix(val, addr) vstore3(val, 0, (__global T1 *)(addr))
+#define TSIZE ((int)sizeof(T1)*3)
+#endif
-__kernel void arithm_flip_rows(__global const uchar* srcptr, int srcstep, int srcoffset,
- __global uchar* dstptr, int dststep, int dstoffset,
+__kernel void arithm_flip_rows(__global const uchar * srcptr, int src_step, int src_offset,
+ __global uchar * dstptr, int dst_step, int dst_offset,
int rows, int cols, int thread_rows, int thread_cols)
{
int x = get_global_id(0);
@@ -50,19 +58,16 @@ __kernel void arithm_flip_rows(__global const uchar* srcptr, int srcstep, int sr
if (x < cols && y < thread_rows)
{
- __global const type* src0 = (__global const type*)(srcptr + mad24(y, srcstep, mad24(x, sizeoftype, srcoffset)));
- __global const type* src1 = (__global const type*)(srcptr + mad24(rows - y - 1, srcstep, mad24(x, sizeoftype, srcoffset)));
+ T src0 = loadpix(srcptr + mad24(y, src_step, mad24(x, TSIZE, src_offset)));
+ T src1 = loadpix(srcptr + mad24(rows - y - 1, src_step, mad24(x, TSIZE, src_offset)));
- __global type* dst0 = (__global type*)(dstptr + mad24(y, dststep, mad24(x, sizeoftype, dstoffset)));
- __global type* dst1 = (__global type*)(dstptr + mad24(rows - y - 1, dststep, mad24(x, sizeoftype, dstoffset)));
-
- dst0[0] = src1[0];
- dst1[0] = src0[0];
+ storepix(src1, dstptr + mad24(y, dst_step, mad24(x, TSIZE, dst_offset)));
+ storepix(src0, dstptr + mad24(rows - y - 1, dst_step, mad24(x, TSIZE, dst_offset)));
}
}
-__kernel void arithm_flip_rows_cols(__global const uchar* srcptr, int srcstep, int srcoffset,
- __global uchar* dstptr, int dststep, int dstoffset,
+__kernel void arithm_flip_rows_cols(__global const uchar * srcptr, int src_step, int src_offset,
+ __global uchar * dstptr, int dst_step, int dst_offset,
int rows, int cols, int thread_rows, int thread_cols)
{
int x = get_global_id(0);
@@ -71,19 +76,16 @@ __kernel void arithm_flip_rows_cols(__global const uchar* srcptr, int srcstep, i
if (x < cols && y < thread_rows)
{
int x1 = cols - x - 1;
- __global const type* src0 = (__global const type*)(srcptr + mad24(y, srcstep, mad24(x, sizeoftype, srcoffset)));
- __global const type* src1 = (__global const type*)(srcptr + mad24(rows - y - 1, srcstep, mad24(x1, sizeoftype, srcoffset)));
-
- __global type* dst0 = (__global type*)(dstptr + mad24(rows - y - 1, dststep, mad24(x1, sizeoftype, dstoffset)));
- __global type* dst1 = (__global type*)(dstptr + mad24(y, dststep, mad24(x, sizeoftype, dstoffset)));
+ T src0 = loadpix(srcptr + mad24(y, src_step, mad24(x, TSIZE, src_offset)));
+ T src1 = loadpix(srcptr + mad24(rows - y - 1, src_step, mad24(x1, TSIZE, src_offset)));
- dst0[0] = src0[0];
- dst1[0] = src1[0];
+ storepix(src0, dstptr + mad24(rows - y - 1, dst_step, mad24(x1, TSIZE, dst_offset)));
+ storepix(src1, dstptr + mad24(y, dst_step, mad24(x, TSIZE, dst_offset)));
}
}
-__kernel void arithm_flip_cols(__global const uchar* srcptr, int srcstep, int srcoffset,
- __global uchar* dstptr, int dststep, int dstoffset,
+__kernel void arithm_flip_cols(__global const uchar * srcptr, int src_step, int src_offset,
+ __global uchar * dstptr, int dst_step, int dst_offset,
int rows, int cols, int thread_rows, int thread_cols)
{
int x = get_global_id(0);
@@ -92,13 +94,10 @@ __kernel void arithm_flip_cols(__global const uchar* srcptr, int srcstep, int sr
if (x < thread_cols && y < rows)
{
int x1 = cols - x - 1;
- __global const type* src0 = (__global const type*)(srcptr + mad24(y, srcstep, mad24(x, sizeoftype, srcoffset)));
- __global const type* src1 = (__global const type*)(srcptr + mad24(y, srcstep, mad24(x1, sizeoftype, srcoffset)));
-
- __global type* dst0 = (__global type*)(dstptr + mad24(y, dststep, mad24(x1, sizeoftype, dstoffset)));
- __global type* dst1 = (__global type*)(dstptr + mad24(y, dststep, mad24(x, sizeoftype, dstoffset)));
+ T src0 = loadpix(srcptr + mad24(y, src_step, mad24(x, TSIZE, src_offset)));
+ T src1 = loadpix(srcptr + mad24(y, src_step, mad24(x1, TSIZE, src_offset)));
- dst1[0] = src1[0];
- dst0[0] = src0[0];
+ storepix(src0, dstptr + mad24(y, dst_step, mad24(x1, TSIZE, dst_offset)));
+ storepix(src1, dstptr + mad24(y, dst_step, mad24(x, TSIZE, dst_offset)));
}
}
From d1cfcfcafd41d81522f8c4d3b64e62d3e7ecb9dc Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Tue, 18 Mar 2014 20:02:04 +0400
Subject: [PATCH 033/117] added 3-channels support to morphology operations
---
modules/imgproc/src/morph.cpp | 54 ++++------
modules/imgproc/src/opencl/morph.cl | 117 +++++++++++-----------
modules/imgproc/test/ocl/test_filters.cpp | 16 +--
3 files changed, 86 insertions(+), 101 deletions(-)
diff --git a/modules/imgproc/src/morph.cpp b/modules/imgproc/src/morph.cpp
index ac958fc691..b4011eecee 100644
--- a/modules/imgproc/src/morph.cpp
+++ b/modules/imgproc/src/morph.cpp
@@ -42,7 +42,6 @@
#include "precomp.hpp"
#include
-#include
#include "opencl_kernels.hpp"
/****************************************************************************************\
@@ -1291,9 +1290,10 @@ static bool ocl_morphology_op(InputArray _src, OutputArray _dst, Mat kernel,
{
CV_Assert(op == MORPH_ERODE || op == MORPH_DILATE);
+ int type = _src.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
bool doubleSupport = ocl::Device::getDefault().doubleFPConfig() > 0;
- if (_src.depth() == CV_64F && !doubleSupport)
+ if (depth == CV_64F && !doubleSupport)
return false;
UMat kernel8U;
@@ -1324,13 +1324,14 @@ static bool ocl_morphology_op(InputArray _src, OutputArray _dst, Mat kernel,
return false;
static const char * const op2str[] = { "ERODE", "DILATE" };
- String buildOptions = format("-D RADIUSX=%d -D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D %s%s%s -D GENTYPE=%s -D DEPTH_%d",
- anchor.x, anchor.y, (int)localThreads[0], (int)localThreads[1], op2str[op],
+ String buildOptions = format("-D RADIUSX=%d -D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D %s%s%s"
+ " -D T=%s -D DEPTH_%d -D cn=%d -D T1=%s", anchor.x, anchor.y,
+ (int)localThreads[0], (int)localThreads[1], op2str[op],
doubleSupport ? " -D DOUBLE_SUPPORT" : "", rectKernel ? " -D RECTKERNEL" : "",
- ocl::typeToStr(_src.type()), _src.depth() );
+ ocl::typeToStr(_src.type()), _src.depth(), cn, ocl::typeToStr(depth));
std::vector kernels;
- for (int i = 0; i= (r_edge) ? (elem1) : (elem2)
-__kernel void morph(__global const uchar * restrict srcptr, int src_step, int src_offset,
+// BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii
+#define ELEM(i, l_edge, r_edge, elem1, elem2) (i) < (l_edge) | (i) >= (r_edge) ? (elem1) : (elem2)
+
+__kernel void morph(__global const uchar * srcptr, int src_step, int src_offset,
__global uchar * dstptr, int dst_step, int dst_offset,
- int src_offset_x, int src_offset_y,
- int cols, int rows,
- __constant uchar * mat_kernel,
- int src_whole_cols, int src_whole_rows)
+ int src_offset_x, int src_offset_y, int cols, int rows,
+ __constant uchar * mat_kernel, int src_whole_cols, int src_whole_rows)
{
- int l_x = get_local_id(0);
- int l_y = get_local_id(1);
- int x = get_group_id(0)*LSIZE0;
- int y = get_group_id(1)*LSIZE1;
- int start_x = x+src_offset_x-RADIUSX;
- int end_x = x + src_offset_x+LSIZE0+RADIUSX;
- int width = end_x -(x+src_offset_x-RADIUSX)+1;
- int start_y = y+src_offset_y-RADIUSY;
- int point1 = mad24(l_y,LSIZE0,l_x);
- int point2 = point1 + LSIZE0*LSIZE1;
- int tl_x = point1 % width;
- int tl_y = point1 / width;
- int tl_x2 = point2 % width;
- int tl_y2 = point2 / width;
- int cur_x = start_x + tl_x;
- int cur_y = start_y + tl_y;
- int cur_x2 = start_x + tl_x2;
- int cur_y2 = start_y + tl_y2;
- int start_addr = mad24(cur_y,src_step, cur_x*(int)sizeof(GENTYPE));
- int start_addr2 = mad24(cur_y2,src_step, cur_x2*(int)sizeof(GENTYPE));
- GENTYPE temp0,temp1;
- __local GENTYPE LDS_DAT[2*LSIZE1*LSIZE0];
+ int gidx = get_global_id(0), gidy = get_global_id(1);
+ int l_x = get_local_id(0), l_y = get_local_id(1);
+ int x = get_group_id(0) * LSIZE0, y = get_group_id(1) * LSIZE1;
+ int start_x = x + src_offset_x - RADIUSX;
+ int end_x = x + src_offset_x + LSIZE0 + RADIUSX;
+ int width = end_x - (x + src_offset_x - RADIUSX) + 1;
+ int start_y = y + src_offset_y - RADIUSY;
+ int point1 = mad24(l_y, LSIZE0, l_x);
+ int point2 = point1 + LSIZE0 * LSIZE1;
+ int tl_x = point1 % width, tl_y = point1 / width;
+ int tl_x2 = point2 % width, tl_y2 = point2 / width;
+ int cur_x = start_x + tl_x, cur_y = start_y + tl_y;
+ int cur_x2 = start_x + tl_x2, cur_y2 = start_y + tl_y2;
+ int start_addr = mad24(cur_y, src_step, cur_x * TSIZE);
+ int start_addr2 = mad24(cur_y2, src_step, cur_x2 * TSIZE);
+
+ __local T LDS_DAT[2*LSIZE1*LSIZE0];
- int end_addr = mad24(src_whole_rows - 1,src_step,src_whole_cols*(int)sizeof(GENTYPE));
- //read pixels from src
- start_addr = ((start_addr < end_addr) && (start_addr > 0)) ? start_addr : 0;
- start_addr2 = ((start_addr2 < end_addr) && (start_addr2 > 0)) ? start_addr2 : 0;
- __global const GENTYPE * src;
- src = (__global const GENTYPE *)(srcptr+start_addr);
- temp0 = src[0];
- src = (__global const GENTYPE *)(srcptr+start_addr2);
- temp1 = src[0];
- //judge if read out of boundary
- temp0= ELEM(cur_x,0,src_whole_cols,(GENTYPE)VAL,temp0);
- temp0= ELEM(cur_y,0,src_whole_rows,(GENTYPE)VAL,temp0);
+ // read pixels from src
+ int end_addr = mad24(src_whole_rows - 1, src_step, src_whole_cols * TSIZE);
+ start_addr = start_addr < end_addr && start_addr > 0 ? start_addr : 0;
+ start_addr2 = start_addr2 < end_addr && start_addr2 > 0 ? start_addr2 : 0;
- temp1= ELEM(cur_x2,0,src_whole_cols,(GENTYPE)VAL,temp1);
- temp1= ELEM(cur_y2,0,src_whole_rows,(GENTYPE)VAL,temp1);
+ T temp0 = loadpix(srcptr + start_addr);
+ T temp1 = loadpix(srcptr + start_addr2);
+
+ // judge if read out of boundary
+ temp0 = ELEM(cur_x, 0, src_whole_cols, (T)(VAL),temp0);
+ temp0 = ELEM(cur_y, 0, src_whole_rows, (T)(VAL),temp0);
+
+ temp1 = ELEM(cur_x2, 0, src_whole_cols, (T)(VAL), temp1);
+ temp1 = ELEM(cur_y2, 0, src_whole_rows, (T)(VAL), temp1);
LDS_DAT[point1] = temp0;
LDS_DAT[point2] = temp1;
barrier(CLK_LOCAL_MEM_FENCE);
- GENTYPE res = (GENTYPE)VAL;
- for(int i=0; i<2*RADIUSY+1; i++)
- for(int j=0; j<2*RADIUSX+1; j++)
+
+ T res = (T)(VAL);
+ for (int i = 0, sizey = 2 * RADIUSY + 1; i < sizey; i++)
+ for (int j = 0, sizex = 2 * RADIUSX + 1; j < sizex; j++)
{
res =
#ifndef RECTKERNEL
mat_kernel[i*(2*RADIUSX+1)+j] ?
#endif
- MORPH_OP(res,LDS_DAT[mad24(l_y+i,width,l_x+j)])
+ MORPH_OP(res, LDS_DAT[mad24(l_y + i, width, l_x + j)])
#ifndef RECTKERNEL
- :res
+ : res
#endif
;
}
- int gidx = get_global_id(0);
- int gidy = get_global_id(1);
- if(gidx
Date: Tue, 18 Mar 2014 19:42:04 +0400
Subject: [PATCH 034/117] added 3-channels support to cv::setIdentity
---
modules/core/src/matrix.cpp | 10 +++++-----
modules/core/src/opencl/set_identity.cl | 19 +++++++++++++++----
2 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp
index db1ce760f3..82d177eda4 100644
--- a/modules/core/src/matrix.cpp
+++ b/modules/core/src/matrix.cpp
@@ -2679,17 +2679,17 @@ namespace cv {
static bool ocl_setIdentity( InputOutputArray _m, const Scalar& s )
{
- int type = _m.type(), cn = CV_MAT_CN(type);
- if (cn == 3)
- return false;
+ int type = _m.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type),
+ sctype = CV_MAKE_TYPE(depth, cn == 3 ? 4 : cn);
ocl::Kernel k("setIdentity", ocl::core::set_identity_oclsrc,
- format("-D T=%s", ocl::memopTypeToStr(type)));
+ format("-D T=%s -D T1=%s -D cn=%d -D ST=%s", ocl::memopTypeToStr(type),
+ ocl::memopTypeToStr(depth), cn, ocl::memopTypeToStr(sctype)));
if (k.empty())
return false;
UMat m = _m.getUMat();
- k.args(ocl::KernelArg::WriteOnly(m), ocl::KernelArg::Constant(Mat(1, 1, type, s)));
+ k.args(ocl::KernelArg::WriteOnly(m), ocl::KernelArg::Constant(Mat(1, 1, sctype, s)));
size_t globalsize[2] = { m.cols, m.rows };
return k.run(2, globalsize, NULL, false);
diff --git a/modules/core/src/opencl/set_identity.cl b/modules/core/src/opencl/set_identity.cl
index d63ce793db..0e8f1424fb 100644
--- a/modules/core/src/opencl/set_identity.cl
+++ b/modules/core/src/opencl/set_identity.cl
@@ -43,17 +43,28 @@
//
//M*/
+#if cn != 3
+#define loadpix(addr) *(__global const T *)(addr)
+#define storepix(val, addr) *(__global T *)(addr) = val
+#define TSIZE (int)sizeof(T)
+#define scalar scalar_
+#else
+#define loadpix(addr) vload3(0, (__global const T1 *)(addr))
+#define storepix(val, addr) vstore3(val, 0, (__global T1 *)(addr))
+#define TSIZE ((int)sizeof(T1)*3)
+#define scalar (T)(scalar_.x, scalar_.y, scalar_.z)
+#endif
+
__kernel void setIdentity(__global uchar * srcptr, int src_step, int src_offset, int rows, int cols,
- T scalar)
+ ST scalar_)
{
int x = get_global_id(0);
int y = get_global_id(1);
if (x < cols && y < rows)
{
- int src_index = mad24(y, src_step, mad24(x, (int)sizeof(T), src_offset));
- __global T * src = (__global T *)(srcptr + src_index);
+ int src_index = mad24(y, src_step, mad24(x, TSIZE, src_offset));
- src[0] = x == y ? scalar : (T)(0);
+ storepix(x == y ? scalar : (T)(0), srcptr + src_index);
}
}
From f9f730c426f312259cc49a3d5b6395e3bdb355db Mon Sep 17 00:00:00 2001
From: Konstantin Matskevich
Date: Wed, 19 Mar 2014 12:14:48 +0400
Subject: [PATCH 035/117] update error message
---
modules/core/src/ocl.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp
index b8f9db5fb4..f048942bfa 100644
--- a/modules/core/src/ocl.cpp
+++ b/modules/core/src/ocl.cpp
@@ -2245,7 +2245,7 @@ not_found:
std::cerr << deviceTypes[t] << " ";
std::cerr << std::endl << " Device name: " << (deviceName.length() == 0 ? "any" : deviceName) << std::endl;
- throw cv::Exception();
+ CV_Error(CL_INVALID_DEVICE, "Requested OpenCL device is not found");
return NULL;
}
From b73490f86c32dc521df466af420446e0ccdf5919 Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Tue, 18 Mar 2014 16:02:25 +0400
Subject: [PATCH 036/117] eliminated restriction src[i].channels() == 1 in
cv::merge
---
modules/core/src/convert.cpp | 36 +++--
modules/core/src/opencl/split_merge.cl | 2 +-
modules/core/test/ocl/test_arithm.cpp | 96 +++++++------
modules/core/test/ocl/test_channels.cpp | 128 ++++++++++--------
modules/core/test/ocl/test_dft.cpp | 16 +--
modules/core/test/ocl/test_gemm.cpp | 16 +--
.../core/test/ocl/test_matrix_operation.cpp | 22 +--
modules/imgproc/test/ocl/test_accumulate.cpp | 16 +--
modules/imgproc/test/ocl/test_blend.cpp | 24 ++--
modules/imgproc/test/ocl/test_boxfilter.cpp | 13 +-
modules/imgproc/test/ocl/test_canny.cpp | 8 +-
modules/imgproc/test/ocl/test_color.cpp | 14 +-
modules/imgproc/test/ocl/test_filter2d.cpp | 8 +-
modules/imgproc/test/ocl/test_filters.cpp | 18 +--
modules/imgproc/test/ocl/test_gftt.cpp | 4 +-
modules/imgproc/test/ocl/test_histogram.cpp | 20 +--
modules/imgproc/test/ocl/test_imgproc.cpp | 48 +++----
.../imgproc/test/ocl/test_match_template.cpp | 12 +-
.../imgproc/test/ocl/test_medianfilter.cpp | 8 +-
modules/imgproc/test/ocl/test_pyramids.cpp | 8 +-
modules/imgproc/test/ocl/test_sepfilter2D.cpp | 8 +-
modules/imgproc/test/ocl/test_warp.cpp | 34 ++---
modules/photo/test/ocl/test_denoising.cpp | 12 +-
modules/ts/include/opencv2/ts/ocl_test.hpp | 74 ++++++----
modules/ts/src/ocl_test.cpp | 8 +-
modules/video/test/ocl/test_bgfg_mog2.cpp | 4 +-
modules/video/test/ocl/test_motempl.cpp | 10 +-
.../video/test/ocl/test_optflow_farneback.cpp | 4 +-
28 files changed, 358 insertions(+), 313 deletions(-)
diff --git a/modules/core/src/convert.cpp b/modules/core/src/convert.cpp
index 0139f6a5bb..cd5cf9b733 100644
--- a/modules/core/src/convert.cpp
+++ b/modules/core/src/convert.cpp
@@ -415,42 +415,54 @@ namespace cv {
static bool ocl_merge( InputArrayOfArrays _mv, OutputArray _dst )
{
- std::vector src;
+ std::vector src, ksrc;
_mv.getUMatVector(src);
CV_Assert(!src.empty());
int type = src[0].type(), depth = CV_MAT_DEPTH(type);
Size size = src[0].size();
- size_t srcsize = src.size();
- for (size_t i = 0; i < srcsize; ++i)
+ for (size_t i = 0, srcsize = src.size(); i < srcsize; ++i)
{
- int itype = src[i].type(), icn = CV_MAT_CN(itype), idepth = CV_MAT_DEPTH(itype);
- if (src[i].dims > 2 || icn != 1)
+ int itype = src[i].type(), icn = CV_MAT_CN(itype), idepth = CV_MAT_DEPTH(itype),
+ esz1 = CV_ELEM_SIZE1(idepth);
+ if (src[i].dims > 2)
return false;
+
CV_Assert(size == src[i].size() && depth == idepth);
+
+ for (int cn = 0; cn < icn; ++cn)
+ {
+ UMat tsrc = src[i];
+ tsrc.offset += cn * esz1;
+ ksrc.push_back(tsrc);
+ }
}
+ int dcn = (int)ksrc.size();
- String srcargs, srcdecl, processelem;
- for (size_t i = 0; i < srcsize; ++i)
+ String srcargs, srcdecl, processelem, cndecl;
+ for (int i = 0; i < dcn; ++i)
{
srcargs += format("DECLARE_SRC_PARAM(%d)", i);
srcdecl += format("DECLARE_DATA(%d)", i);
processelem += format("PROCESS_ELEM(%d)", i);
+ cndecl += format(" -D scn%d=%d", i, ksrc[i].channels());
}
ocl::Kernel k("merge", ocl::core::split_merge_oclsrc,
- format("-D OP_MERGE -D cn=%d -D T=%s -D DECLARE_SRC_PARAMS_N=%s -D DECLARE_DATA_N=%s -D PROCESS_ELEMS_N=%s",
- (int)srcsize, ocl::memopTypeToStr(depth), srcargs.c_str(), srcdecl.c_str(), processelem.c_str()));
+ format("-D OP_MERGE -D cn=%d -D T=%s -D DECLARE_SRC_PARAMS_N=%s"
+ " -D DECLARE_DATA_N=%s -D PROCESS_ELEMS_N=%s%s",
+ dcn, ocl::memopTypeToStr(depth), srcargs.c_str(),
+ srcdecl.c_str(), processelem.c_str(), cndecl.c_str()));
if (k.empty())
return false;
- _dst.create(size, CV_MAKE_TYPE(depth, (int)srcsize));
+ _dst.create(size, CV_MAKE_TYPE(depth, dcn));
UMat dst = _dst.getUMat();
int argidx = 0;
- for (size_t i = 0; i < srcsize; ++i)
- argidx = k.set(argidx, ocl::KernelArg::ReadOnlyNoSize(src[i]));
+ for (int i = 0; i < dcn; ++i)
+ argidx = k.set(argidx, ocl::KernelArg::ReadOnlyNoSize(ksrc[i]));
k.set(argidx, ocl::KernelArg::WriteOnly(dst));
size_t globalsize[2] = { dst.cols, dst.rows };
diff --git a/modules/core/src/opencl/split_merge.cl b/modules/core/src/opencl/split_merge.cl
index 8a1bc49039..7d277056a1 100644
--- a/modules/core/src/opencl/split_merge.cl
+++ b/modules/core/src/opencl/split_merge.cl
@@ -45,7 +45,7 @@
#define DECLARE_SRC_PARAM(index) __global const uchar * src##index##ptr, int src##index##_step, int src##index##_offset,
#define DECLARE_DATA(index) __global const T * src##index = \
- (__global T *)(src##index##ptr + mad24(src##index##_step, y, mad24(x, (int)sizeof(T), src##index##_offset)));
+ (__global T *)(src##index##ptr + mad24(src##index##_step, y, mad24(x, (int)sizeof(T) * scn##index, src##index##_offset)));
#define PROCESS_ELEM(index) dst[index] = src##index[0];
__kernel void merge(DECLARE_SRC_PARAMS_N
diff --git a/modules/core/test/ocl/test_arithm.cpp b/modules/core/test/ocl/test_arithm.cpp
index 4dd8d150c3..8618746c9f 100644
--- a/modules/core/test/ocl/test_arithm.cpp
+++ b/modules/core/test/ocl/test_arithm.cpp
@@ -57,9 +57,9 @@ PARAM_TEST_CASE(Lut, MatDepth, MatDepth, Channels, bool, bool)
int cn;
bool use_roi, same_cn;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_INPUT_PARAMETER(lut)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_INPUT_PARAMETER(lut);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -87,14 +87,14 @@ PARAM_TEST_CASE(Lut, MatDepth, MatDepth, Channels, bool, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, dst_type, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_INPUT_PARAMETER(lut)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_INPUT_PARAMETER(lut);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.)
{
- OCL_EXPECT_MATS_NEAR(dst, threshold)
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
};
@@ -121,11 +121,11 @@ PARAM_TEST_CASE(ArithmTestBase, MatDepth, Channels, bool)
cv::Scalar val;
cv::Scalar val_in_range;
- TEST_DECLARE_INPUT_PARAMETER(src1)
- TEST_DECLARE_INPUT_PARAMETER(src2)
- TEST_DECLARE_INPUT_PARAMETER(mask)
- TEST_DECLARE_OUTPUT_PARAMETER(dst1)
- TEST_DECLARE_OUTPUT_PARAMETER(dst2)
+ TEST_DECLARE_INPUT_PARAMETER(src1);
+ TEST_DECLARE_INPUT_PARAMETER(src2);
+ TEST_DECLARE_INPUT_PARAMETER(mask);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst1);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst2);
virtual void SetUp()
{
@@ -167,21 +167,21 @@ PARAM_TEST_CASE(ArithmTestBase, MatDepth, Channels, bool)
rng.uniform(minV, maxV), rng.uniform(minV, maxV));
}
- UMAT_UPLOAD_INPUT_PARAMETER(src1)
- UMAT_UPLOAD_INPUT_PARAMETER(src2)
- UMAT_UPLOAD_INPUT_PARAMETER(mask)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst1)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst2)
+ UMAT_UPLOAD_INPUT_PARAMETER(src1);
+ UMAT_UPLOAD_INPUT_PARAMETER(src2);
+ UMAT_UPLOAD_INPUT_PARAMETER(mask);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst2);
}
void Near(double threshold = 0.)
{
- OCL_EXPECT_MATS_NEAR(dst1, threshold)
+ OCL_EXPECT_MATS_NEAR(dst1, threshold);
}
void Near1(double threshold = 0.)
{
- OCL_EXPECT_MATS_NEAR(dst2, threshold)
+ OCL_EXPECT_MATS_NEAR(dst2, threshold);
}
};
@@ -556,6 +556,12 @@ OCL_TEST_P(Transpose, Mat)
{
generateTestData();
+ Size roiSize = src1_roi.size();
+ Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
+ randomSubMat(dst1, dst1_roi, Size(roiSize.height, roiSize.width), dst1Border, src1.type(), 5, 16);
+
+ UMAT_UPLOAD_INPUT_PARAMETER(dst1);
+
OCL_OFF(cv::transpose(src1_roi, dst1_roi));
OCL_ON(cv::transpose(usrc1_roi, udst1_roi));
@@ -580,7 +586,7 @@ OCL_TEST_P(Transpose, SquareInplace)
OCL_OFF(cv::transpose(src1_roi, src1_roi));
OCL_ON(cv::transpose(usrc1_roi, usrc1_roi));
- OCL_EXPECT_MATS_NEAR(src1, 0)
+ OCL_EXPECT_MATS_NEAR(src1, 0);
}
}
@@ -761,7 +767,7 @@ OCL_TEST_P(Bitwise_not, Mat)
typedef ArithmTestBase Compare;
static const int cmp_codes[] = { CMP_EQ, CMP_GT, CMP_GE, CMP_LT, CMP_LE, CMP_NE };
-static const char* cmp_strs[] = { "CMP_EQ", "CMP_GT", "CMP_GE", "CMP_LT", "CMP_LE", "CMP_NE" };
+static const char * cmp_strs[] = { "CMP_EQ", "CMP_GT", "CMP_GE", "CMP_LT", "CMP_LE", "CMP_NE" };
static const int cmp_num = sizeof(cmp_codes) / sizeof(int);
OCL_TEST_P(Compare, Mat)
@@ -826,12 +832,14 @@ OCL_TEST_P(Pow, Mat)
for (int j = 0; j < test_loop_times; j++)
for (int k = 0, size = sizeof(pows) / sizeof(double); k < size; ++k)
{
+ SCOPED_TRACE(pows[k]);
+
generateTestData();
OCL_OFF(cv::pow(src1_roi, pows[k], dst1_roi));
OCL_ON(cv::pow(usrc1_roi, pows[k], udst1_roi));
- Near(1); // FIXIT: Relative error check!
+ OCL_EXPECT_MATS_NEAR_RELATIVE(dst1, 1e-6);
}
}
@@ -893,8 +901,8 @@ struct RepeatTestCase :
Border dst1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst1, dst1_roi, dstRoiSize, dst1Border, type, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src1)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst1)
+ UMAT_UPLOAD_INPUT_PARAMETER(src1);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
}
};
@@ -1450,10 +1458,10 @@ PARAM_TEST_CASE(InRange, MatDepth, Channels, bool /*Scalar or not*/, bool /*Roi*
bool scalars, use_roi;
cv::Scalar val1, val2;
- TEST_DECLARE_INPUT_PARAMETER(src1)
- TEST_DECLARE_INPUT_PARAMETER(src2)
- TEST_DECLARE_INPUT_PARAMETER(src3)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src1);
+ TEST_DECLARE_INPUT_PARAMETER(src2);
+ TEST_DECLARE_INPUT_PARAMETER(src3);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -1485,15 +1493,15 @@ PARAM_TEST_CASE(InRange, MatDepth, Channels, bool /*Scalar or not*/, bool /*Roi*
val2 = cv::Scalar(rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0),
rng.uniform(-100.0, 100.0), rng.uniform(-100.0, 100.0));
- UMAT_UPLOAD_INPUT_PARAMETER(src1)
- UMAT_UPLOAD_INPUT_PARAMETER(src2)
- UMAT_UPLOAD_INPUT_PARAMETER(src3)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src1);
+ UMAT_UPLOAD_INPUT_PARAMETER(src2);
+ UMAT_UPLOAD_INPUT_PARAMETER(src3);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near()
{
- OCL_EXPECT_MATS_NEAR(dst, 0)
+ OCL_EXPECT_MATS_NEAR(dst, 0);
}
};
@@ -1565,7 +1573,7 @@ PARAM_TEST_CASE(PatchNaNs, Channels, bool)
bool use_roi;
double value;
- TEST_DECLARE_INPUT_PARAMETER(src)
+ TEST_DECLARE_INPUT_PARAMETER(src);
virtual void SetUp()
{
@@ -1592,12 +1600,12 @@ PARAM_TEST_CASE(PatchNaNs, Channels, bool)
value = randomDouble(-100, 100);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
}
void Near()
{
- OCL_EXPECT_MATS_NEAR(src, 0)
+ OCL_EXPECT_MATS_NEAR(src, 0);
}
};
@@ -1640,8 +1648,8 @@ PARAM_TEST_CASE(Reduce, std::pair, Channels, int, bool)
int sdepth, ddepth, cn, dim, dtype;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -1666,8 +1674,8 @@ PARAM_TEST_CASE(Reduce, std::pair, Channels, int, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, dstRoiSize, dstBorder, dtype, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
@@ -1683,7 +1691,7 @@ OCL_TEST_P(ReduceSum, Mat)
OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, CV_REDUCE_SUM, dtype));
double eps = ddepth <= CV_32S ? 1 : 1e-4;
- OCL_EXPECT_MATS_NEAR(dst, eps)
+ OCL_EXPECT_MATS_NEAR(dst, eps);
}
}
@@ -1698,7 +1706,7 @@ OCL_TEST_P(ReduceMax, Mat)
OCL_OFF(cv::reduce(src_roi, dst_roi, dim, CV_REDUCE_MAX, dtype));
OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, CV_REDUCE_MAX, dtype));
- OCL_EXPECT_MATS_NEAR(dst, 0)
+ OCL_EXPECT_MATS_NEAR(dst, 0);
}
}
@@ -1713,7 +1721,7 @@ OCL_TEST_P(ReduceMin, Mat)
OCL_OFF(cv::reduce(src_roi, dst_roi, dim, CV_REDUCE_MIN, dtype));
OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, CV_REDUCE_MIN, dtype));
- OCL_EXPECT_MATS_NEAR(dst, 0)
+ OCL_EXPECT_MATS_NEAR(dst, 0);
}
}
@@ -1729,7 +1737,7 @@ OCL_TEST_P(ReduceAvg, Mat)
OCL_ON(cv::reduce(usrc_roi, udst_roi, dim, CV_REDUCE_AVG, dtype));
double eps = ddepth <= CV_32S ? 1 : 5e-6;
- OCL_EXPECT_MATS_NEAR(dst, eps)
+ OCL_EXPECT_MATS_NEAR(dst, eps);
}
}
diff --git a/modules/core/test/ocl/test_channels.cpp b/modules/core/test/ocl/test_channels.cpp
index f0dc102504..7565273e7a 100644
--- a/modules/core/test/ocl/test_channels.cpp
+++ b/modules/core/test/ocl/test_channels.cpp
@@ -54,16 +54,16 @@ namespace ocl {
//////////////////////////////////////// Merge ///////////////////////////////////////////////
-PARAM_TEST_CASE(Merge, MatDepth, Channels, bool)
+PARAM_TEST_CASE(Merge, MatDepth, int, bool)
{
- int depth, cn;
+ int depth, nsrc;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src1)
- TEST_DECLARE_INPUT_PARAMETER(src2)
- TEST_DECLARE_INPUT_PARAMETER(src3)
- TEST_DECLARE_INPUT_PARAMETER(src4)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src1);
+ TEST_DECLARE_INPUT_PARAMETER(src2);
+ TEST_DECLARE_INPUT_PARAMETER(src3);
+ TEST_DECLARE_INPUT_PARAMETER(src4);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
std::vector src_roi;
std::vector usrc_roi;
@@ -71,10 +71,15 @@ PARAM_TEST_CASE(Merge, MatDepth, Channels, bool)
virtual void SetUp()
{
depth = GET_PARAM(0);
- cn = GET_PARAM(1);
+ nsrc = GET_PARAM(1);
use_roi = GET_PARAM(2);
- CV_Assert(cn >= 1 && cn <= 4);
+ CV_Assert(nsrc >= 1 && nsrc <= 4);
+ }
+
+ int type()
+ {
+ return CV_MAKE_TYPE(depth, randomInt(1, 3));
}
void generateTestData()
@@ -83,34 +88,39 @@ PARAM_TEST_CASE(Merge, MatDepth, Channels, bool)
{
Border src1Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
- randomSubMat(src1, src1_roi, roiSize, src1Border, depth, 2, 11);
+ randomSubMat(src1, src1_roi, roiSize, src1Border, type(), 2, 11);
Border src2Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
- randomSubMat(src2, src2_roi, roiSize, src2Border, depth, -1540, 1740);
+ randomSubMat(src2, src2_roi, roiSize, src2Border, type(), -1540, 1740);
Border src3Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
- randomSubMat(src3, src3_roi, roiSize, src3Border, depth, -1540, 1740);
+ randomSubMat(src3, src3_roi, roiSize, src3Border, type(), -1540, 1740);
Border src4Border = randomBorder(0, use_roi ? MAX_VALUE : 0);
- randomSubMat(src4, src4_roi, roiSize, src4Border, depth, -1540, 1740);
+ randomSubMat(src4, src4_roi, roiSize, src4Border, type(), -1540, 1740);
}
- Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
- randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_MAKE_TYPE(depth, cn), 5, 16);
-
- UMAT_UPLOAD_INPUT_PARAMETER(src1)
- UMAT_UPLOAD_INPUT_PARAMETER(src2)
- UMAT_UPLOAD_INPUT_PARAMETER(src3)
- UMAT_UPLOAD_INPUT_PARAMETER(src4)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src1);
+ UMAT_UPLOAD_INPUT_PARAMETER(src2);
+ UMAT_UPLOAD_INPUT_PARAMETER(src3);
+ UMAT_UPLOAD_INPUT_PARAMETER(src4);
src_roi.push_back(src1_roi), usrc_roi.push_back(usrc1_roi);
- if (cn >= 2)
+ if (nsrc >= 2)
src_roi.push_back(src2_roi), usrc_roi.push_back(usrc2_roi);
- if (cn >= 3)
+ if (nsrc >= 3)
src_roi.push_back(src3_roi), usrc_roi.push_back(usrc3_roi);
- if (cn >= 4)
+ if (nsrc >= 4)
src_roi.push_back(src4_roi), usrc_roi.push_back(usrc4_roi);
+
+ int dcn = 0;
+ for (int i = 0; i < nsrc; ++i)
+ dcn += src_roi[i].channels();
+
+ Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
+ randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_MAKE_TYPE(depth, dcn), 5, 16);
+
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.)
@@ -139,11 +149,11 @@ PARAM_TEST_CASE(Split, MatType, Channels, bool)
int depth, cn;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst1)
- TEST_DECLARE_OUTPUT_PARAMETER(dst2)
- TEST_DECLARE_OUTPUT_PARAMETER(dst3)
- TEST_DECLARE_OUTPUT_PARAMETER(dst4)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst1);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst2);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst3);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst4);
std::vector dst_roi, dst;
std::vector udst_roi, udst;
@@ -177,11 +187,11 @@ PARAM_TEST_CASE(Split, MatType, Channels, bool)
randomSubMat(dst4, dst4_roi, roiSize, dst4Border, depth, -1540, 1740);
}
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst1)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst2)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst3)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst4)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst2);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst3);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst4);
dst_roi.push_back(dst1_roi), udst_roi.push_back(udst1_roi),
dst.push_back(dst1), udst.push_back(udst1);
@@ -221,14 +231,14 @@ PARAM_TEST_CASE(MixChannels, MatType, bool)
int depth;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src1)
- TEST_DECLARE_INPUT_PARAMETER(src2)
- TEST_DECLARE_INPUT_PARAMETER(src3)
- TEST_DECLARE_INPUT_PARAMETER(src4)
- TEST_DECLARE_OUTPUT_PARAMETER(dst1)
- TEST_DECLARE_OUTPUT_PARAMETER(dst2)
- TEST_DECLARE_OUTPUT_PARAMETER(dst3)
- TEST_DECLARE_OUTPUT_PARAMETER(dst4)
+ TEST_DECLARE_INPUT_PARAMETER(src1);
+ TEST_DECLARE_INPUT_PARAMETER(src2);
+ TEST_DECLARE_INPUT_PARAMETER(src3);
+ TEST_DECLARE_INPUT_PARAMETER(src4);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst1);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst2);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst3);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst4);
std::vector src_roi, dst_roi, dst;
std::vector usrc_roi, udst_roi, udst;
@@ -287,15 +297,15 @@ PARAM_TEST_CASE(MixChannels, MatType, bool)
randomSubMat(dst4, dst4_roi, roiSize, dst4Border, type(), -1540, 1740);
}
- UMAT_UPLOAD_INPUT_PARAMETER(src1)
- UMAT_UPLOAD_INPUT_PARAMETER(src2)
- UMAT_UPLOAD_INPUT_PARAMETER(src3)
- UMAT_UPLOAD_INPUT_PARAMETER(src4)
+ UMAT_UPLOAD_INPUT_PARAMETER(src1);
+ UMAT_UPLOAD_INPUT_PARAMETER(src2);
+ UMAT_UPLOAD_INPUT_PARAMETER(src3);
+ UMAT_UPLOAD_INPUT_PARAMETER(src4);
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst1)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst2)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst3)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst4)
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst1);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst2);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst3);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst4);
int nsrc = randomInt(1, 5), ndst = randomInt(1, 5);
@@ -360,8 +370,8 @@ PARAM_TEST_CASE(InsertChannel, MatDepth, Channels, bool)
int depth, cn, coi;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -381,8 +391,8 @@ PARAM_TEST_CASE(InsertChannel, MatDepth, Channels, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_MAKE_TYPE(depth, cn), 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
@@ -406,8 +416,8 @@ PARAM_TEST_CASE(ExtractChannel, MatDepth, Channels, bool)
int depth, cn, coi;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -427,8 +437,8 @@ PARAM_TEST_CASE(ExtractChannel, MatDepth, Channels, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, depth, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
@@ -447,7 +457,7 @@ OCL_TEST_P(ExtractChannel, Accuracy)
//////////////////////////////////////// Instantiation ///////////////////////////////////////////////
-OCL_INSTANTIATE_TEST_CASE_P(Channels, Merge, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
+OCL_INSTANTIATE_TEST_CASE_P(Channels, Merge, Combine(OCL_ALL_DEPTHS, Values(1, 2, 3, 4), Bool()));
OCL_INSTANTIATE_TEST_CASE_P(Channels, Split, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
OCL_INSTANTIATE_TEST_CASE_P(Channels, MixChannels, Combine(OCL_ALL_DEPTHS, Bool()));
OCL_INSTANTIATE_TEST_CASE_P(Channels, InsertChannel, Combine(OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
diff --git a/modules/core/test/ocl/test_dft.cpp b/modules/core/test/ocl/test_dft.cpp
index cc9b06d38c..1f0e43b20e 100644
--- a/modules/core/test/ocl/test_dft.cpp
+++ b/modules/core/test/ocl/test_dft.cpp
@@ -60,8 +60,8 @@ PARAM_TEST_CASE(Dft, cv::Size, MatDepth, bool, bool, bool, bool)
int dft_flags, depth;
bool inplace;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -106,9 +106,9 @@ PARAM_TEST_CASE(MulSpectrums, bool, bool)
{
bool ccorr, useRoi;
- TEST_DECLARE_INPUT_PARAMETER(src1)
- TEST_DECLARE_INPUT_PARAMETER(src2)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src1);
+ TEST_DECLARE_INPUT_PARAMETER(src2);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -129,9 +129,9 @@ PARAM_TEST_CASE(MulSpectrums, bool, bool)
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, srcRoiSize, dstBorder, CV_32FC2, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src1)
- UMAT_UPLOAD_INPUT_PARAMETER(src2)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src1);
+ UMAT_UPLOAD_INPUT_PARAMETER(src2);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
diff --git a/modules/core/test/ocl/test_gemm.cpp b/modules/core/test/ocl/test_gemm.cpp
index 4d453f334a..e92fc2a1c9 100644
--- a/modules/core/test/ocl/test_gemm.cpp
+++ b/modules/core/test/ocl/test_gemm.cpp
@@ -67,10 +67,10 @@ PARAM_TEST_CASE(Gemm,
double alpha, beta;
- TEST_DECLARE_INPUT_PARAMETER(A)
- TEST_DECLARE_INPUT_PARAMETER(B)
- TEST_DECLARE_INPUT_PARAMETER(C)
- TEST_DECLARE_OUTPUT_PARAMETER(D)
+ TEST_DECLARE_INPUT_PARAMETER(A);
+ TEST_DECLARE_INPUT_PARAMETER(B);
+ TEST_DECLARE_INPUT_PARAMETER(C);
+ TEST_DECLARE_OUTPUT_PARAMETER(D);
virtual void SetUp()
{
@@ -119,10 +119,10 @@ PARAM_TEST_CASE(Gemm,
alpha = randomDouble(-4, 4);
beta = randomDouble(-4, 4);
- UMAT_UPLOAD_INPUT_PARAMETER(A)
- UMAT_UPLOAD_INPUT_PARAMETER(B)
- UMAT_UPLOAD_INPUT_PARAMETER(C)
- UMAT_UPLOAD_OUTPUT_PARAMETER(D)
+ UMAT_UPLOAD_INPUT_PARAMETER(A);
+ UMAT_UPLOAD_INPUT_PARAMETER(B);
+ UMAT_UPLOAD_INPUT_PARAMETER(C);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(D);
}
};
diff --git a/modules/core/test/ocl/test_matrix_operation.cpp b/modules/core/test/ocl/test_matrix_operation.cpp
index 77c5dad956..901609538e 100644
--- a/modules/core/test/ocl/test_matrix_operation.cpp
+++ b/modules/core/test/ocl/test_matrix_operation.cpp
@@ -59,8 +59,8 @@ PARAM_TEST_CASE(ConvertTo, MatDepth, MatDepth, Channels, bool)
int src_depth, cn, dstType;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -80,8 +80,8 @@ PARAM_TEST_CASE(ConvertTo, MatDepth, MatDepth, Channels, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, dstType, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
@@ -108,9 +108,9 @@ PARAM_TEST_CASE(CopyTo, MatDepth, Channels, bool, bool)
int depth, cn;
bool use_roi, use_mask;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_INPUT_PARAMETER(mask)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_INPUT_PARAMETER(mask);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -139,10 +139,10 @@ PARAM_TEST_CASE(CopyTo, MatDepth, Channels, bool, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
if (use_mask)
- UMAT_UPLOAD_INPUT_PARAMETER(mask)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(mask);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
@@ -169,7 +169,7 @@ OCL_TEST_P(CopyTo, Accuracy)
}
OCL_INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine(
- OCL_ALL_DEPTHS, OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
+ OCL_ALL_DEPTHS, OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool()));
OCL_INSTANTIATE_TEST_CASE_P(MatrixOperation, CopyTo, Combine(
OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool(), Bool()));
diff --git a/modules/imgproc/test/ocl/test_accumulate.cpp b/modules/imgproc/test/ocl/test_accumulate.cpp
index 586c34b26a..50c9085cb4 100644
--- a/modules/imgproc/test/ocl/test_accumulate.cpp
+++ b/modules/imgproc/test/ocl/test_accumulate.cpp
@@ -58,10 +58,10 @@ PARAM_TEST_CASE(AccumulateBase, std::pair, Channels, bool)
bool useRoi;
double alpha;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_INPUT_PARAMETER(mask)
- TEST_DECLARE_INPUT_PARAMETER(src2)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_INPUT_PARAMETER(mask);
+ TEST_DECLARE_INPUT_PARAMETER(src2);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -90,10 +90,10 @@ PARAM_TEST_CASE(AccumulateBase, std::pair, Channels, bool)
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, dtype, -MAX_VALUE, MAX_VALUE);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_INPUT_PARAMETER(mask)
- UMAT_UPLOAD_INPUT_PARAMETER(src2)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_INPUT_PARAMETER(mask);
+ UMAT_UPLOAD_INPUT_PARAMETER(src2);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
alpha = randomDouble(-5, 5);
}
diff --git a/modules/imgproc/test/ocl/test_blend.cpp b/modules/imgproc/test/ocl/test_blend.cpp
index 17c0b13123..7b62b97172 100644
--- a/modules/imgproc/test/ocl/test_blend.cpp
+++ b/modules/imgproc/test/ocl/test_blend.cpp
@@ -57,11 +57,11 @@ PARAM_TEST_CASE(BlendLinear, MatDepth, Channels, bool)
int depth, channels;
bool useRoi;
- TEST_DECLARE_INPUT_PARAMETER(src1)
- TEST_DECLARE_INPUT_PARAMETER(src2)
- TEST_DECLARE_INPUT_PARAMETER(weights2)
- TEST_DECLARE_INPUT_PARAMETER(weights1)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src1);
+ TEST_DECLARE_INPUT_PARAMETER(src2);
+ TEST_DECLARE_INPUT_PARAMETER(weights2);
+ TEST_DECLARE_INPUT_PARAMETER(weights1);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -89,22 +89,22 @@ PARAM_TEST_CASE(BlendLinear, MatDepth, Channels, bool)
randomSubMat(weights2, weights2_roi, roiSize, weights2Border, CV_32FC1, 1e-2, upValue);
weights2_roi -= weights1_roi;
- CV_Assert(checkNorm(weights2_roi, weights2(Rect(weights2Border.lef, weights2Border.top,
+ CV_Assert(checkNorm2(weights2_roi, weights2(Rect(weights2Border.lef, weights2Border.top,
roiSize.width, roiSize.height))) < 1e-6);
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src1)
- UMAT_UPLOAD_INPUT_PARAMETER(src2)
- UMAT_UPLOAD_INPUT_PARAMETER(weights1)
- UMAT_UPLOAD_INPUT_PARAMETER(weights2)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src1);
+ UMAT_UPLOAD_INPUT_PARAMETER(src2);
+ UMAT_UPLOAD_INPUT_PARAMETER(weights1);
+ UMAT_UPLOAD_INPUT_PARAMETER(weights2);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double eps = 0.0)
{
- OCL_EXPECT_MATS_NEAR(dst, eps)
+ OCL_EXPECT_MATS_NEAR(dst, eps);
}
};
diff --git a/modules/imgproc/test/ocl/test_boxfilter.cpp b/modules/imgproc/test/ocl/test_boxfilter.cpp
index c95657c9e9..e1e936afe3 100644
--- a/modules/imgproc/test/ocl/test_boxfilter.cpp
+++ b/modules/imgproc/test/ocl/test_boxfilter.cpp
@@ -61,8 +61,8 @@ PARAM_TEST_CASE(BoxFilterBase, MatDepth, Channels, BorderType, bool, bool)
Point anchor;
bool normalize, useRoi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -76,7 +76,6 @@ PARAM_TEST_CASE(BoxFilterBase, MatDepth, Channels, BorderType, bool, bool)
void random_roi()
{
int type = CV_MAKE_TYPE(depth, cn);
- dsize = randomSize(1, MAX_VALUE);
ksize = randomSize(kernelMinSize, kernelMaxSize);
Size roiSize = randomSize(ksize.width, MAX_VALUE, ksize.height, MAX_VALUE);
@@ -84,18 +83,18 @@ PARAM_TEST_CASE(BoxFilterBase, MatDepth, Channels, BorderType, bool, bool)
randomSubMat(src, src_roi, roiSize, srcBorder, type, -MAX_VALUE, MAX_VALUE);
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
- randomSubMat(dst, dst_roi, dsize, dstBorder, type, -MAX_VALUE, MAX_VALUE);
+ randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -MAX_VALUE, MAX_VALUE);
anchor.x = randomInt(-1, ksize.width);
anchor.y = randomInt(-1, ksize.height);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.0)
{
- OCL_EXPECT_MATS_NEAR(dst, threshold)
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
};
diff --git a/modules/imgproc/test/ocl/test_canny.cpp b/modules/imgproc/test/ocl/test_canny.cpp
index e328d2a2fd..f791cac64c 100644
--- a/modules/imgproc/test/ocl/test_canny.cpp
+++ b/modules/imgproc/test/ocl/test_canny.cpp
@@ -63,8 +63,8 @@ PARAM_TEST_CASE(Canny, AppertureSize, L2gradient, UseRoi)
int apperture_size;
bool useL2gradient, use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -89,8 +89,8 @@ PARAM_TEST_CASE(Canny, AppertureSize, L2gradient, UseRoi)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
diff --git a/modules/imgproc/test/ocl/test_color.cpp b/modules/imgproc/test/ocl/test_color.cpp
index ffd392a030..fcf270f8e7 100644
--- a/modules/imgproc/test/ocl/test_color.cpp
+++ b/modules/imgproc/test/ocl/test_color.cpp
@@ -59,8 +59,8 @@ PARAM_TEST_CASE(CvtColor, MatDepth, bool)
int depth;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -80,13 +80,13 @@ PARAM_TEST_CASE(CvtColor, MatDepth, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, dstType, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold)
{
- OCL_EXPECT_MATS_NEAR(dst, threshold)
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
void performTest(int channelsIn, int channelsOut, int code, double threshold = 1e-3)
@@ -287,8 +287,8 @@ struct CvtColor_YUV420 :
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, dstType, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
diff --git a/modules/imgproc/test/ocl/test_filter2d.cpp b/modules/imgproc/test/ocl/test_filter2d.cpp
index 54d65459c5..21b3fff2d7 100644
--- a/modules/imgproc/test/ocl/test_filter2d.cpp
+++ b/modules/imgproc/test/ocl/test_filter2d.cpp
@@ -63,8 +63,8 @@ PARAM_TEST_CASE(Filter2D, MatDepth, Channels, BorderType, bool, bool)
bool useRoi;
Mat kernel;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -91,8 +91,8 @@ PARAM_TEST_CASE(Filter2D, MatDepth, Channels, BorderType, bool, bool)
anchor.x = randomInt(-1, ksize.width);
anchor.y = randomInt(-1, ksize.height);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.0)
diff --git a/modules/imgproc/test/ocl/test_filters.cpp b/modules/imgproc/test/ocl/test_filters.cpp
index fe16fe81d5..d929daeedb 100644
--- a/modules/imgproc/test/ocl/test_filters.cpp
+++ b/modules/imgproc/test/ocl/test_filters.cpp
@@ -69,8 +69,8 @@ PARAM_TEST_CASE(FilterTestBase, MatType,
double param;
bool useRoi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -94,8 +94,8 @@ PARAM_TEST_CASE(FilterTestBase, MatType,
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -60, 70);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near()
@@ -112,15 +112,9 @@ PARAM_TEST_CASE(FilterTestBase, MatType,
void Near(double threshold, bool relative)
{
if (relative)
- {
- EXPECT_MAT_NEAR_RELATIVE(dst, udst, threshold);
- EXPECT_MAT_NEAR_RELATIVE(dst_roi, udst_roi, threshold);
- }
+ OCL_EXPECT_MATS_NEAR_RELATIVE(dst, threshold);
else
- {
- EXPECT_MAT_NEAR(dst, udst, threshold);
- EXPECT_MAT_NEAR(dst_roi, udst_roi, threshold);
- }
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
};
diff --git a/modules/imgproc/test/ocl/test_gftt.cpp b/modules/imgproc/test/ocl/test_gftt.cpp
index e47997623f..6e65f90dd0 100644
--- a/modules/imgproc/test/ocl/test_gftt.cpp
+++ b/modules/imgproc/test/ocl/test_gftt.cpp
@@ -60,7 +60,7 @@ PARAM_TEST_CASE(GoodFeaturesToTrack, double, bool)
static const int maxCorners;
static const double qualityLevel;
- TEST_DECLARE_INPUT_PARAMETER(src)
+ TEST_DECLARE_INPUT_PARAMETER(src);
UMat points, upoints;
virtual void SetUp()
@@ -79,7 +79,7 @@ PARAM_TEST_CASE(GoodFeaturesToTrack, double, bool)
randomSubMat(src, src_roi, roiSize, srcBorder, frame.type(), 5, 256);
src_roi.copyTo(frame);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
}
void UMatToVector(const UMat & um, std::vector & v) const
diff --git a/modules/imgproc/test/ocl/test_histogram.cpp b/modules/imgproc/test/ocl/test_histogram.cpp
index b0837eeaa2..0a27907b63 100644
--- a/modules/imgproc/test/ocl/test_histogram.cpp
+++ b/modules/imgproc/test/ocl/test_histogram.cpp
@@ -76,8 +76,8 @@ PARAM_TEST_CASE(CalcBackProject, MatDepth, int, bool)
std::vector uimages;
std::vector uimages_roi;
- TEST_DECLARE_INPUT_PARAMETER(hist)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(hist);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -139,8 +139,8 @@ PARAM_TEST_CASE(CalcBackProject, MatDepth, int, bool)
uimages_roi[i] = uimages[i](Rect(ofs.x, ofs.y, images_roi[i].cols, images_roi[i].rows));
}
- UMAT_UPLOAD_INPUT_PARAMETER(hist)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(hist);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
scale = randomDouble(0.1, 1);
}
@@ -157,7 +157,7 @@ OCL_TEST_P(CalcBackProject, Mat)
OCL_OFF(cv::calcBackProject(images_roi, channels, hist_roi, dst_roi, ranges, scale));
OCL_ON(cv::calcBackProject(uimages_roi, channels, uhist_roi, udst_roi, ranges, scale));
- OCL_EXPECT_MATS_NEAR(dst, 0.0)
+ OCL_EXPECT_MATS_NEAR(dst, 0.0);
}
}
@@ -167,8 +167,8 @@ PARAM_TEST_CASE(CalcHist, bool)
{
bool useRoi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(hist)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(hist);
virtual void SetUp()
{
@@ -185,8 +185,8 @@ PARAM_TEST_CASE(CalcHist, bool)
Border histBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(hist, hist_roi, Size(1, 256), histBorder, CV_32SC1, 0, MAX_VALUE);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(hist)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(hist);
}
};
@@ -205,7 +205,7 @@ OCL_TEST_P(CalcHist, Mat)
OCL_OFF(cv::calcHist(std::vector(1, src_roi), channels, noArray(), hist_roi, histSize, ranges, false));
OCL_ON(cv::calcHist(std::vector(1, usrc_roi), channels, noArray(), uhist_roi, histSize, ranges, false));
- OCL_EXPECT_MATS_NEAR(hist, 0.0)
+ OCL_EXPECT_MATS_NEAR(hist, 0.0);
}
}
diff --git a/modules/imgproc/test/ocl/test_imgproc.cpp b/modules/imgproc/test/ocl/test_imgproc.cpp
index 78b2e573d4..ad8e26cbca 100644
--- a/modules/imgproc/test/ocl/test_imgproc.cpp
+++ b/modules/imgproc/test/ocl/test_imgproc.cpp
@@ -70,8 +70,8 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType,
int type, borderType, blockSize;
bool useRoi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -90,16 +90,16 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType,
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.0, bool relative = false)
{
if (relative)
- OCL_EXPECT_MATS_NEAR_RELATIVE(dst, threshold)
+ OCL_EXPECT_MATS_NEAR_RELATIVE(dst, threshold);
else
- OCL_EXPECT_MATS_NEAR(dst, threshold)
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
};
@@ -117,8 +117,8 @@ PARAM_TEST_CASE(CopyMakeBorder, MatDepth, // depth
TestUtils::Border border;
Scalar val;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -148,13 +148,13 @@ PARAM_TEST_CASE(CopyMakeBorder, MatDepth, // depth
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -MAX_VALUE, MAX_VALUE);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near()
{
- OCL_EXPECT_MATS_NEAR(dst, 0)
+ OCL_EXPECT_MATS_NEAR(dst, 0);
}
};
@@ -217,8 +217,8 @@ struct CornerTestBase :
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_32FC1, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
@@ -286,7 +286,7 @@ struct Integral :
{
int sdepth, sqdepth;
- TEST_DECLARE_OUTPUT_PARAMETER(dst2)
+ TEST_DECLARE_OUTPUT_PARAMETER(dst2);
virtual void SetUp()
{
@@ -310,17 +310,17 @@ struct Integral :
Border dst2Border = randomBorder(0, useRoi ? 2 : 0);
randomSubMat(dst2, dst2_roi, isize, dst2Border, sqdepth, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst2)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst2);
}
void Near2(double threshold = 0.0, bool relative = false)
{
if (relative)
- OCL_EXPECT_MATS_NEAR_RELATIVE(dst2, threshold)
+ OCL_EXPECT_MATS_NEAR_RELATIVE(dst2, threshold);
else
- OCL_EXPECT_MATS_NEAR(dst2, threshold)
+ OCL_EXPECT_MATS_NEAR(dst2, threshold);
}
};
@@ -390,8 +390,8 @@ PARAM_TEST_CASE(CLAHETest, Size, double, bool)
double clipLimit;
bool useRoi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -409,13 +409,13 @@ PARAM_TEST_CASE(CLAHETest, Size, double, bool)
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, CV_8UC1, 5, 16);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.0)
{
- OCL_EXPECT_MATS_NEAR(dst, threshold)
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
};
diff --git a/modules/imgproc/test/ocl/test_match_template.cpp b/modules/imgproc/test/ocl/test_match_template.cpp
index c283b8c0b1..f0a61302d1 100644
--- a/modules/imgproc/test/ocl/test_match_template.cpp
+++ b/modules/imgproc/test/ocl/test_match_template.cpp
@@ -62,9 +62,9 @@ PARAM_TEST_CASE(MatchTemplate, MatDepth, Channels, MatchTemplType, bool)
int method;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(image)
- TEST_DECLARE_INPUT_PARAMETER(templ)
- TEST_DECLARE_OUTPUT_PARAMETER(result)
+ TEST_DECLARE_INPUT_PARAMETER(image);
+ TEST_DECLARE_INPUT_PARAMETER(templ);
+ TEST_DECLARE_OUTPUT_PARAMETER(result);
virtual void SetUp()
{
@@ -92,9 +92,9 @@ PARAM_TEST_CASE(MatchTemplate, MatDepth, Channels, MatchTemplType, bool)
Border resultBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(result, result_roi, result_roiSize, resultBorder, CV_32FC1, -upValue, upValue);
- UMAT_UPLOAD_INPUT_PARAMETER(image)
- UMAT_UPLOAD_INPUT_PARAMETER(templ)
- UMAT_UPLOAD_OUTPUT_PARAMETER(result)
+ UMAT_UPLOAD_INPUT_PARAMETER(image);
+ UMAT_UPLOAD_INPUT_PARAMETER(templ);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(result);
}
void Near(double threshold = 0.0)
diff --git a/modules/imgproc/test/ocl/test_medianfilter.cpp b/modules/imgproc/test/ocl/test_medianfilter.cpp
index 0116197269..63690872a5 100644
--- a/modules/imgproc/test/ocl/test_medianfilter.cpp
+++ b/modules/imgproc/test/ocl/test_medianfilter.cpp
@@ -57,8 +57,8 @@ PARAM_TEST_CASE(MedianFilter, MatDepth, Channels, int, bool)
int ksize;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -76,8 +76,8 @@ PARAM_TEST_CASE(MedianFilter, MatDepth, Channels, int, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -MAX_VALUE, MAX_VALUE);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.0)
diff --git a/modules/imgproc/test/ocl/test_pyramids.cpp b/modules/imgproc/test/ocl/test_pyramids.cpp
index d6174a5b78..113349b302 100644
--- a/modules/imgproc/test/ocl/test_pyramids.cpp
+++ b/modules/imgproc/test/ocl/test_pyramids.cpp
@@ -57,8 +57,8 @@ PARAM_TEST_CASE(PyrTestBase, MatDepth, Channels, bool)
int depth, channels;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -75,8 +75,8 @@ PARAM_TEST_CASE(PyrTestBase, MatDepth, Channels, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, dst_roiSize, dstBorder, CV_MAKETYPE(depth, channels), -MAX_VALUE, MAX_VALUE);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.0)
diff --git a/modules/imgproc/test/ocl/test_sepfilter2D.cpp b/modules/imgproc/test/ocl/test_sepfilter2D.cpp
index 5e824d6b2a..d242a734f6 100644
--- a/modules/imgproc/test/ocl/test_sepfilter2D.cpp
+++ b/modules/imgproc/test/ocl/test_sepfilter2D.cpp
@@ -62,8 +62,8 @@ PARAM_TEST_CASE(SepFilter2D, MatDepth, Channels, BorderType, bool, bool)
bool useRoi;
Mat kernelX, kernelY;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -103,8 +103,8 @@ PARAM_TEST_CASE(SepFilter2D, MatDepth, Channels, BorderType, bool, bool)
anchor.x = -1;
anchor.y = -1;
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.0)
diff --git a/modules/imgproc/test/ocl/test_warp.cpp b/modules/imgproc/test/ocl/test_warp.cpp
index 3963b671a2..8c82d8224d 100644
--- a/modules/imgproc/test/ocl/test_warp.cpp
+++ b/modules/imgproc/test/ocl/test_warp.cpp
@@ -73,8 +73,8 @@ PARAM_TEST_CASE(WarpTestBase, MatType, Interpolation, bool, bool)
Size dsize;
bool useRoi, mapInverse;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -98,13 +98,13 @@ PARAM_TEST_CASE(WarpTestBase, MatType, Interpolation, bool, bool)
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, dsize, dstBorder, type, -MAX_VALUE, MAX_VALUE);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
void Near(double threshold = 0.0)
{
- OCL_EXPECT_MATS_NEAR(dst, threshold)
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
};
@@ -164,8 +164,8 @@ PARAM_TEST_CASE(Resize, MatType, double, double, Interpolation, bool)
double fx, fy;
bool useRoi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -202,7 +202,7 @@ PARAM_TEST_CASE(Resize, MatType, double, double, Interpolation, bool)
void Near(double threshold = 0.0)
{
- OCL_EXPECT_MATS_NEAR(dst, threshold)
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
};
@@ -230,10 +230,10 @@ PARAM_TEST_CASE(Remap, MatDepth, Channels, std::pair, BorderTy
Scalar val;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_INPUT_PARAMETER(map1)
- TEST_DECLARE_INPUT_PARAMETER(map2)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_INPUT_PARAMETER(map1);
+ TEST_DECLARE_INPUT_PARAMETER(map2);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -269,16 +269,16 @@ PARAM_TEST_CASE(Remap, MatDepth, Channels, std::pair, BorderTy
randomSubMat(map2, map2_roi, dstROISize, map2Border, map2Type, mapMinValue, mapMaxValue);
}
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_INPUT_PARAMETER(map1)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_INPUT_PARAMETER(map1);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
if (noType != map2Type)
- UMAT_UPLOAD_INPUT_PARAMETER(map2)
+ UMAT_UPLOAD_INPUT_PARAMETER(map2);
}
void Near(double threshold = 0.0)
{
- OCL_EXPECT_MATS_NEAR(dst, threshold)
+ OCL_EXPECT_MATS_NEAR(dst, threshold);
}
};
diff --git a/modules/photo/test/ocl/test_denoising.cpp b/modules/photo/test/ocl/test_denoising.cpp
index 745a45745f..cc880886bd 100644
--- a/modules/photo/test/ocl/test_denoising.cpp
+++ b/modules/photo/test/ocl/test_denoising.cpp
@@ -19,8 +19,8 @@ PARAM_TEST_CASE(FastNlMeansDenoisingTestBase, Channels, bool)
float h;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(src)
- TEST_DECLARE_OUTPUT_PARAMETER(dst)
+ TEST_DECLARE_INPUT_PARAMETER(src);
+ TEST_DECLARE_OUTPUT_PARAMETER(dst);
virtual void SetUp()
{
@@ -52,8 +52,8 @@ PARAM_TEST_CASE(FastNlMeansDenoisingTestBase, Channels, bool)
Border dstBorder = randomBorder(0, use_roi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, 0, 255);
- UMAT_UPLOAD_INPUT_PARAMETER(src)
- UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
+ UMAT_UPLOAD_INPUT_PARAMETER(src);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(dst);
}
};
@@ -68,7 +68,7 @@ OCL_TEST_P(FastNlMeansDenoising, Mat)
OCL_OFF(cv::fastNlMeansDenoising(src_roi, dst_roi, h, templateWindowSize, searchWindowSize));
OCL_ON(cv::fastNlMeansDenoising(usrc_roi, udst_roi, h, templateWindowSize, searchWindowSize));
- OCL_EXPECT_MATS_NEAR(dst, 1)
+ OCL_EXPECT_MATS_NEAR(dst, 1);
}
}
@@ -83,7 +83,7 @@ OCL_TEST_P(fastNlMeansDenoisingColored, Mat)
OCL_OFF(cv::fastNlMeansDenoisingColored(src_roi, dst_roi, h, h, templateWindowSize, searchWindowSize));
OCL_ON(cv::fastNlMeansDenoisingColored(usrc_roi, udst_roi, h, h, templateWindowSize, searchWindowSize));
- OCL_EXPECT_MATS_NEAR(dst, 1)
+ OCL_EXPECT_MATS_NEAR(dst, 1);
}
}
diff --git a/modules/ts/include/opencv2/ts/ocl_test.hpp b/modules/ts/include/opencv2/ts/ocl_test.hpp
index 169e34fdcc..0f0d9657fe 100644
--- a/modules/ts/include/opencv2/ts/ocl_test.hpp
+++ b/modules/ts/include/opencv2/ts/ocl_test.hpp
@@ -62,53 +62,73 @@ extern int test_loop_times;
#define MAX_VALUE 357
#define EXPECT_MAT_NORM(mat, eps) \
+do \
{ \
- EXPECT_LE(TestUtils::checkNorm(mat), eps) \
-}
+ EXPECT_LE(TestUtils::checkNorm1(mat), eps) \
+} while ((void)0, 0)
#define EXPECT_MAT_NEAR(mat1, mat2, eps) \
+do \
{ \
ASSERT_EQ(mat1.type(), mat2.type()); \
ASSERT_EQ(mat1.size(), mat2.size()); \
- EXPECT_LE(TestUtils::checkNorm(mat1, mat2), eps) \
+ EXPECT_LE(TestUtils::checkNorm2(mat1, mat2), eps) \
<< "Size: " << mat1.size() << std::endl; \
-}
+} while ((void)0, 0)
#define EXPECT_MAT_NEAR_RELATIVE(mat1, mat2, eps) \
+do \
{ \
ASSERT_EQ(mat1.type(), mat2.type()); \
ASSERT_EQ(mat1.size(), mat2.size()); \
EXPECT_LE(TestUtils::checkNormRelative(mat1, mat2), eps) \
<< "Size: " << mat1.size() << std::endl; \
-}
+} while ((void)0, 0)
#define OCL_EXPECT_MATS_NEAR(name, eps) \
+do \
{ \
- EXPECT_MAT_NEAR(name ## _roi, u ## name ## _roi, eps); \
- int nextValue = rng.next(); \
- RNG dataRng1(nextValue), dataRng2(nextValue); \
- dataRng1.fill(name ## _roi, RNG::UNIFORM, Scalar::all(-MAX_VALUE), Scalar::all(MAX_VALUE)); \
- dataRng2.fill(u ## name ## _roi, RNG::UNIFORM, Scalar::all(-MAX_VALUE), Scalar::all(MAX_VALUE)); \
- EXPECT_MAT_NEAR(name, u ## name, 0/*FLT_EPSILON*/); \
-}
+ ASSERT_EQ(name ## _roi.type(), u ## name ## _roi.type()); \
+ ASSERT_EQ(name ## _roi.size(), u ## name ## _roi.size()); \
+ EXPECT_LE(TestUtils::checkNorm2(name ## _roi, u ## name ## _roi), eps) \
+ << "Size: " << name ## _roi.size() << std::endl; \
+ Point _offset; \
+ Size _wholeSize; \
+ u ## name ## _roi.locateROI(_wholeSize, _offset); \
+ Mat _mask(name.size(), CV_8UC1, Scalar::all(255)); \
+ _mask(Rect(_offset, name ## _roi.size())).setTo(Scalar::all(0)); \
+ ASSERT_EQ(name.type(), u ## name.type()); \
+ ASSERT_EQ(name.size(), u ## name.size()); \
+ EXPECT_LE(TestUtils::checkNorm2(name, u ## name, _mask), eps) \
+ << "Size: " << name ## _roi.size() << std::endl; \
+} while ((void)0, 0)
#define OCL_EXPECT_MATS_NEAR_RELATIVE(name, eps) \
+do \
{ \
- EXPECT_MAT_NEAR_RELATIVE(name ## _roi, u ## name ## _roi, eps); \
- int nextValue = rng.next(); \
- RNG dataRng1(nextValue), dataRng2(nextValue); \
- dataRng1.fill(name ## _roi, RNG::UNIFORM, Scalar::all(-MAX_VALUE), Scalar::all(MAX_VALUE)); \
- dataRng2.fill(u ## name ## _roi, RNG::UNIFORM, Scalar::all(-MAX_VALUE), Scalar::all(MAX_VALUE)); \
- EXPECT_MAT_NEAR_RELATIVE(name, u ## name, 0/*FLT_EPSILON*/); \
-}
+ ASSERT_EQ(name ## _roi.type(), u ## name ## _roi.type()); \
+ ASSERT_EQ(name ## _roi.size(), u ## name ## _roi.size()); \
+ EXPECT_LE(TestUtils::checkNormRelative(name ## _roi, u ## name ## _roi), eps) \
+ << "Size: " << name ## _roi.size() << std::endl; \
+ Point _offset; \
+ Size _wholeSize; \
+ name ## _roi.locateROI(_wholeSize, _offset); \
+ Mat _mask(name.size(), CV_8UC1, Scalar::all(255)); \
+ _mask(Rect(_offset, name ## _roi.size())).setTo(Scalar::all(0)); \
+ ASSERT_EQ(name.type(), u ## name.type()); \
+ ASSERT_EQ(name.size(), u ## name.size()); \
+ EXPECT_LE(TestUtils::checkNormRelative(name, u ## name, _mask), eps) \
+ << "Size: " << name ## _roi.size() << std::endl; \
+} while ((void)0, 0)
#define EXPECT_MAT_SIMILAR(mat1, mat2, eps) \
+do \
{ \
ASSERT_EQ(mat1.type(), mat2.type()); \
ASSERT_EQ(mat1.size(), mat2.size()); \
EXPECT_LE(checkSimilarity(mat1, mat2), eps) \
<< "Size: " << mat1.size() << std::endl; \
-}
+} while ((void)0, 0)
using perf::MatDepth;
using perf::MatType;
@@ -205,28 +225,30 @@ struct CV_EXPORTS TestUtils
static cv::Mat readImage(const String &fileName, int flags = cv::IMREAD_COLOR);
static cv::Mat readImageType(const String &fname, int type);
- static double checkNorm(InputArray m);
- static double checkNorm(InputArray m1, InputArray m2);
+ static double checkNorm1(InputArray m, InputArray mask = noArray());
+ static double checkNorm2(InputArray m1, InputArray m2, InputArray mask = noArray());
static double checkSimilarity(InputArray m1, InputArray m2);
static void showDiff(InputArray _src, InputArray _gold, InputArray _actual, double eps, bool alwaysShow);
- static inline double checkNormRelative(InputArray m1, InputArray m2)
+ static inline double checkNormRelative(InputArray m1, InputArray m2, InputArray mask = noArray())
{
- return cv::norm(m1.getMat(), m2.getMat(), cv::NORM_INF) /
+ return cv::norm(m1.getMat(), m2.getMat(), cv::NORM_INF, mask) /
std::max((double)std::numeric_limits::epsilon(),
(double)std::max(cv::norm(m1.getMat(), cv::NORM_INF), norm(m2.getMat(), cv::NORM_INF)));
}
};
-#define TEST_DECLARE_INPUT_PARAMETER(name) Mat name, name ## _roi; UMat u ## name, u ## name ## _roi;
+#define TEST_DECLARE_INPUT_PARAMETER(name) Mat name, name ## _roi; UMat u ## name, u ## name ## _roi
#define TEST_DECLARE_OUTPUT_PARAMETER(name) TEST_DECLARE_INPUT_PARAMETER(name)
#define UMAT_UPLOAD_INPUT_PARAMETER(name) \
+do \
{ \
name.copyTo(u ## name); \
Size _wholeSize; Point ofs; name ## _roi.locateROI(_wholeSize, ofs); \
u ## name ## _roi = u ## name(Rect(ofs.x, ofs.y, name ## _roi.size().width, name ## _roi.size().height)); \
-}
+} while ((void)0, 0)
+
#define UMAT_UPLOAD_OUTPUT_PARAMETER(name) UMAT_UPLOAD_INPUT_PARAMETER(name)
template
diff --git a/modules/ts/src/ocl_test.cpp b/modules/ts/src/ocl_test.cpp
index caf5bf4105..0291cadbed 100644
--- a/modules/ts/src/ocl_test.cpp
+++ b/modules/ts/src/ocl_test.cpp
@@ -223,14 +223,14 @@ Mat TestUtils::readImageType(const String &fname, int type)
return src;
}
-double TestUtils::checkNorm(InputArray m)
+double TestUtils::checkNorm1(InputArray m, InputArray mask)
{
- return norm(m.getMat(), NORM_INF);
+ return norm(m.getMat(), NORM_INF, mask);
}
-double TestUtils::checkNorm(InputArray m1, InputArray m2)
+double TestUtils::checkNorm2(InputArray m1, InputArray m2, InputArray mask)
{
- return norm(m1.getMat(), m2.getMat(), NORM_INF);
+ return norm(m1.getMat(), m2.getMat(), NORM_INF, mask);
}
double TestUtils::checkSimilarity(InputArray m1, InputArray m2)
diff --git a/modules/video/test/ocl/test_bgfg_mog2.cpp b/modules/video/test/ocl/test_bgfg_mog2.cpp
index bfb1621fe6..0a52227ece 100644
--- a/modules/video/test/ocl/test_bgfg_mog2.cpp
+++ b/modules/video/test/ocl/test_bgfg_mog2.cpp
@@ -70,7 +70,7 @@ OCL_TEST_P(Mog2_Update, Accuracy)
OCL_ON (mog2_ocl->apply(frame, u_foreground));
if (detectShadow)
- EXPECT_MAT_SIMILAR(foreground, u_foreground, 15e-3)
+ EXPECT_MAT_SIMILAR(foreground, u_foreground, 15e-3);
else
EXPECT_MAT_NEAR(foreground, u_foreground, 0);
}
@@ -133,4 +133,4 @@ OCL_INSTANTIATE_TEST_CASE_P(OCL_Video, Mog2_getBackgroundImage, (Values(DetectSh
}}// namespace cvtest::ocl
#endif
-#endif
\ No newline at end of file
+#endif
diff --git a/modules/video/test/ocl/test_motempl.cpp b/modules/video/test/ocl/test_motempl.cpp
index 7b4c22755e..91053d9add 100644
--- a/modules/video/test/ocl/test_motempl.cpp
+++ b/modules/video/test/ocl/test_motempl.cpp
@@ -18,8 +18,8 @@ PARAM_TEST_CASE(UpdateMotionHistory, bool)
double timestamp, duration;
bool use_roi;
- TEST_DECLARE_INPUT_PARAMETER(silhouette)
- TEST_DECLARE_OUTPUT_PARAMETER(mhi)
+ TEST_DECLARE_INPUT_PARAMETER(silhouette);
+ TEST_DECLARE_OUTPUT_PARAMETER(mhi);
virtual void SetUp()
{
@@ -40,8 +40,8 @@ PARAM_TEST_CASE(UpdateMotionHistory, bool)
if (timestamp < duration)
std::swap(timestamp, duration);
- UMAT_UPLOAD_INPUT_PARAMETER(silhouette)
- UMAT_UPLOAD_OUTPUT_PARAMETER(mhi)
+ UMAT_UPLOAD_INPUT_PARAMETER(silhouette);
+ UMAT_UPLOAD_OUTPUT_PARAMETER(mhi);
}
};
@@ -54,7 +54,7 @@ OCL_TEST_P(UpdateMotionHistory, Mat)
OCL_OFF(cv::updateMotionHistory(silhouette_roi, mhi_roi, timestamp, duration));
OCL_ON(cv::updateMotionHistory(usilhouette_roi, umhi_roi, timestamp, duration));
- OCL_EXPECT_MATS_NEAR(mhi, 0)
+ OCL_EXPECT_MATS_NEAR(mhi, 0);
}
}
diff --git a/modules/video/test/ocl/test_optflow_farneback.cpp b/modules/video/test/ocl/test_optflow_farneback.cpp
index c2d13e0065..cc40f749ba 100644
--- a/modules/video/test/ocl/test_optflow_farneback.cpp
+++ b/modules/video/test/ocl/test_optflow_farneback.cpp
@@ -101,7 +101,7 @@ OCL_TEST_P(FarnebackOpticalFlow, Mat)
OCL_OFF(cv::calcOpticalFlowFarneback(frame0, frame1, flow, pyrScale, numLevels, winSize, numIters, polyN, polySigma, flags));
OCL_ON(cv::calcOpticalFlowFarneback(frame0, frame1, uflow, pyrScale, numLevels, winSize, numIters, polyN, polySigma, flags));
- EXPECT_MAT_SIMILAR(flow, uflow, 0.1)
+ EXPECT_MAT_SIMILAR(flow, uflow, 0.1);
}
@@ -117,4 +117,4 @@ OCL_INSTANTIATE_TEST_CASE_P(Video, FarnebackOpticalFlow,
} } // namespace cvtest::ocl
-#endif // HAVE_OPENCL
\ No newline at end of file
+#endif // HAVE_OPENCL
From b449b0bf71cf7fb69d8dd7a61ce43ebd5d239f91 Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Wed, 19 Mar 2014 15:59:00 +0400
Subject: [PATCH 037/117] simplified cv::sepFilter2D OpenCL part
---
modules/imgproc/src/filter.cpp | 137 +++----
modules/imgproc/src/opencl/filterSepCol.cl | 62 ++-
modules/imgproc/src/opencl/filterSepRow.cl | 373 ++++--------------
.../src/opencl/filterSep_singlePass.cl | 11 +-
modules/imgproc/test/ocl/test_sepfilter2D.cpp | 4 +-
5 files changed, 167 insertions(+), 420 deletions(-)
diff --git a/modules/imgproc/src/filter.cpp b/modules/imgproc/src/filter.cpp
index bb54471c07..ba2e347af0 100644
--- a/modules/imgproc/src/filter.cpp
+++ b/modules/imgproc/src/filter.cpp
@@ -41,6 +41,7 @@
//M*/
#include "precomp.hpp"
+#define CV_OPENCL_RUN_ASSERT
#include "opencl_kernels.hpp"
#include
@@ -3317,11 +3318,9 @@ static bool ocl_filter2D( InputArray _src, OutputArray _dst, int ddepth,
return kernel.run(2, globalsize, localsize, true);
}
-static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor, int borderType, bool sync)
+static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor, int borderType)
{
- int type = src.type();
- int cn = CV_MAT_CN(type);
- int sdepth = CV_MAT_DEPTH(type);
+ int type = src.type(), cn = CV_MAT_CN(type), sdepth = CV_MAT_DEPTH(type);
Size bufSize = buf.size();
#ifdef ANDROID
@@ -3329,27 +3328,14 @@ static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor,
#else
size_t localsize[2] = {16, 16};
#endif
+
size_t globalsize[2] = {DIVUP(bufSize.width, localsize[0]) * localsize[0], DIVUP(bufSize.height, localsize[1]) * localsize[1]};
- if (CV_8U == sdepth)
- {
- switch (cn)
- {
- case 1:
- globalsize[0] = DIVUP((bufSize.width + 3) >> 2, localsize[0]) * localsize[0];
- break;
- case 2:
- globalsize[0] = DIVUP((bufSize.width + 1) >> 1, localsize[0]) * localsize[0];
- break;
- case 4:
- globalsize[0] = DIVUP(bufSize.width, localsize[0]) * localsize[0];
- break;
- }
- }
+ if (type == CV_8UC1)
+ globalsize[0] = DIVUP((bufSize.width + 3) >> 2, localsize[0]) * localsize[0];
- int radiusX = anchor;
- int radiusY = (int)((buf.rows - src.rows) >> 1);
+ int radiusX = anchor, radiusY = (buf.rows - src.rows) >> 1;
- bool isIsolatedBorder = (borderType & BORDER_ISOLATED) != 0;
+ bool isolated = (borderType & BORDER_ISOLATED) != 0;
const char * const borderMap[] = { "BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", "BORDER_WRAP", "BORDER_REFLECT_101" },
* const btype = borderMap[borderType & ~BORDER_ISOLATED];
@@ -3358,49 +3344,38 @@ static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor,
extra_extrapolation |= src.cols < (int)((-radiusX + globalsize[0] + 8 * localsize[0] + 3) >> 1) + 1;
extra_extrapolation |= src.cols < radiusX;
- cv::String build_options = cv::format("-D RADIUSX=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D %s -D %s",
- radiusX, (int)localsize[0], (int)localsize[1], cn,
- btype,
- extra_extrapolation ? "EXTRA_EXTRAPOLATION" : "NO_EXTRA_EXTRAPOLATION",
- isIsolatedBorder ? "BORDER_ISOLATED" : "NO_BORDER_ISOLATED");
+ char cvt[40];
+ cv::String build_options = cv::format("-D RADIUSX=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D %s -D %s"
+ " -D srcT=%s -D dstT=%s -D convertToDstT=%s -D srcT1=%s -D dstT1=%s",
+ radiusX, (int)localsize[0], (int)localsize[1], cn, btype,
+ extra_extrapolation ? "EXTRA_EXTRAPOLATION" : "NO_EXTRA_EXTRAPOLATION",
+ isolated ? "BORDER_ISOLATED" : "NO_BORDER_ISOLATED",
+ ocl::typeToStr(type), ocl::typeToStr(CV_32FC(cn)),
+ ocl::convertTypeStr(sdepth, CV_32F, cn, cvt),
+ ocl::typeToStr(sdepth), ocl::typeToStr(CV_32F));
build_options += ocl::kernelToStr(kernelX, CV_32F);
Size srcWholeSize; Point srcOffset;
src.locateROI(srcWholeSize, srcOffset);
- std::stringstream strKernel;
- strKernel << "row_filter";
- if (-1 != cn)
- strKernel << "_C" << cn;
- if (-1 != sdepth)
- strKernel << "_D" << sdepth;
+ String kernelName("row_filter");
+ if (type == CV_8UC1)
+ kernelName += "_C1_D0";
- ocl::Kernel kernelRow;
- if (!kernelRow.create(strKernel.str().c_str(), cv::ocl::imgproc::filterSepRow_oclsrc,
- build_options))
+ ocl::Kernel k(kernelName.c_str(), cv::ocl::imgproc::filterSepRow_oclsrc,
+ build_options);
+ if (k.empty())
return false;
- int idxArg = 0;
- idxArg = kernelRow.set(idxArg, ocl::KernelArg::PtrReadOnly(src));
- idxArg = kernelRow.set(idxArg, (int)(src.step / src.elemSize()));
-
- idxArg = kernelRow.set(idxArg, srcOffset.x);
- idxArg = kernelRow.set(idxArg, srcOffset.y);
- idxArg = kernelRow.set(idxArg, src.cols);
- idxArg = kernelRow.set(idxArg, src.rows);
- idxArg = kernelRow.set(idxArg, srcWholeSize.width);
- idxArg = kernelRow.set(idxArg, srcWholeSize.height);
-
- idxArg = kernelRow.set(idxArg, ocl::KernelArg::PtrWriteOnly(buf));
- idxArg = kernelRow.set(idxArg, (int)(buf.step / buf.elemSize()));
- idxArg = kernelRow.set(idxArg, buf.cols);
- idxArg = kernelRow.set(idxArg, buf.rows);
- idxArg = kernelRow.set(idxArg, radiusY);
-
- return kernelRow.run(2, globalsize, localsize, sync);
+ k.args(ocl::KernelArg::PtrReadOnly(src), (int)(src.step / src.elemSize()), srcOffset.x,
+ srcOffset.y, src.cols, src.rows, srcWholeSize.width, srcWholeSize.height,
+ ocl::KernelArg::PtrWriteOnly(buf), (int)(buf.step / buf.elemSize()),
+ buf.cols, buf.rows, radiusY);
+
+ return k.run(2, globalsize, localsize, false);
}
-static bool ocl_sepColFilter2D(const UMat &buf, UMat &dst, Mat &kernelY, int anchor, bool sync)
+static bool ocl_sepColFilter2D(const UMat &buf, UMat &dst, Mat &kernelY, int anchor)
{
#ifdef ANDROID
size_t localsize[2] = {16, 10};
@@ -3420,28 +3395,23 @@ static bool ocl_sepColFilter2D(const UMat &buf, UMat &dst, Mat &kernelY, int anc
globalsize[0] = DIVUP(sz.width, localsize[0]) * localsize[0];
char cvt[40];
- cv::String build_options = cv::format("-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s",
- anchor, (int)localsize[0], (int)localsize[1], cn, ocl::typeToStr(buf.type()),
- ocl::typeToStr(dtype), ocl::convertTypeStr(CV_32F, ddepth, cn, cvt));
+ cv::String build_options = cv::format("-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d"
+ " -D srcT=%s -D dstT=%s -D convertToDstT=%s",
+ anchor, (int)localsize[0], (int)localsize[1], cn,
+ ocl::typeToStr(buf.type()), ocl::typeToStr(dtype),
+ ocl::convertTypeStr(CV_32F, ddepth, cn, cvt));
build_options += ocl::kernelToStr(kernelY, CV_32F);
- ocl::Kernel kernelCol;
- if (!kernelCol.create("col_filter", cv::ocl::imgproc::filterSepCol_oclsrc, build_options))
+ ocl::Kernel k("col_filter", cv::ocl::imgproc::filterSepCol_oclsrc,
+ build_options);
+ if (k.empty())
return false;
- int idxArg = 0;
- idxArg = kernelCol.set(idxArg, ocl::KernelArg::PtrReadOnly(buf));
- idxArg = kernelCol.set(idxArg, (int)(buf.step / buf.elemSize()));
- idxArg = kernelCol.set(idxArg, buf.cols);
- idxArg = kernelCol.set(idxArg, buf.rows);
-
- idxArg = kernelCol.set(idxArg, ocl::KernelArg::PtrWriteOnly(dst));
- idxArg = kernelCol.set(idxArg, (int)(dst.offset / dst.elemSize()));
- idxArg = kernelCol.set(idxArg, (int)(dst.step / dst.elemSize()));
- idxArg = kernelCol.set(idxArg, dst.cols);
- idxArg = kernelCol.set(idxArg, dst.rows);
-
- return kernelCol.run(2, globalsize, localsize, sync);
+ k.args(ocl::KernelArg::PtrReadOnly(buf), (int)(buf.step / buf.elemSize()), buf.cols,
+ buf.rows, ocl::KernelArg::PtrWriteOnly(dst), (int)(dst.offset / dst.elemSize()),
+ (int)(dst.step / dst.elemSize()), dst.cols, dst.rows);
+
+ return k.run(2, globalsize, localsize, false);
}
const int optimizedSepFilterLocalSize = 16;
@@ -3473,12 +3443,14 @@ static bool ocl_sepFilter2D_SinglePass(InputArray _src, OutputArray _dst,
String opts = cv::format("-D BLK_X=%d -D BLK_Y=%d -D RADIUSX=%d -D RADIUSY=%d%s%s"
" -D srcT=%s -D convertToWT=%s -D WT=%s -D dstT=%s -D convertToDstT=%s"
- " -D %s", (int)lt2[0], (int)lt2[1], _row_kernel.size().height / 2, _col_kernel.size().height / 2,
+ " -D %s -D srcT1=%s -D dstT1=%s -D cn=%d", (int)lt2[0], (int)lt2[1],
+ _row_kernel.size().height / 2, _col_kernel.size().height / 2,
ocl::kernelToStr(_row_kernel, CV_32F, "KERNEL_MATRIX_X").c_str(),
ocl::kernelToStr(_col_kernel, CV_32F, "KERNEL_MATRIX_Y").c_str(),
ocl::typeToStr(stype), ocl::convertTypeStr(sdepth, wdepth, cn, cvt[0]),
ocl::typeToStr(CV_MAKE_TYPE(wdepth, cn)), ocl::typeToStr(dtype),
- ocl::convertTypeStr(wdepth, ddepth, cn, cvt[1]), borderMap[borderType]);
+ ocl::convertTypeStr(wdepth, ddepth, cn, cvt[1]), borderMap[borderType],
+ ocl::typeToStr(sdepth), ocl::typeToStr(ddepth), cn);
ocl::Kernel k("sep_filter", ocl::imgproc::filterSep_singlePass_oclsrc, opts);
if (k.empty())
@@ -3529,10 +3501,13 @@ static bool ocl_sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
if (ddepth < 0)
ddepth = sdepth;
- CV_OCL_RUN_(kernelY.rows <= 21 && kernelX.rows <= 21 &&
- imgSize.width > optimizedSepFilterLocalSize + (kernelX.rows >> 1) &&
- imgSize.height > optimizedSepFilterLocalSize + (kernelY.rows >> 1),
- ocl_sepFilter2D_SinglePass(_src, _dst, _kernelX, _kernelY, borderType, ddepth), true)
+// printf("%d %d\n", imgSize.width, optimizedSepFilterLocalSize + (kernelX.rows >> 1));
+// printf("%d %d\n", imgSize.height, optimizedSepFilterLocalSize + (kernelY.rows >> 1));
+
+// CV_OCL_RUN_(kernelY.rows <= 21 && kernelX.rows <= 21 &&
+// imgSize.width > optimizedSepFilterLocalSize + (kernelX.rows >> 1) &&
+// imgSize.height > optimizedSepFilterLocalSize + (kernelY.rows >> 1),
+// ocl_sepFilter2D_SinglePass(_src, _dst, _kernelX, _kernelY, borderType, ddepth), true)
UMat src = _src.getUMat();
Size srcWholeSize; Point srcOffset;
@@ -3546,12 +3521,12 @@ static bool ocl_sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
Size srcSize = src.size();
Size bufSize(srcSize.width, srcSize.height + kernelY.cols - 1);
UMat buf; buf.create(bufSize, CV_MAKETYPE(CV_32F, cn));
- if (!ocl_sepRowFilter2D(src, buf, kernelX, anchor.x, borderType, false))
+ if (!ocl_sepRowFilter2D(src, buf, kernelX, anchor.x, borderType))
return false;
_dst.create(srcSize, CV_MAKETYPE(ddepth, cn));
UMat dst = _dst.getUMat();
- return ocl_sepColFilter2D(buf, dst, kernelY, anchor.y, false);
+ return ocl_sepColFilter2D(buf, dst, kernelY, anchor.y);
}
#endif
diff --git a/modules/imgproc/src/opencl/filterSepCol.cl b/modules/imgproc/src/opencl/filterSepCol.cl
index 30a2221cf1..05717c6ad2 100644
--- a/modules/imgproc/src/opencl/filterSepCol.cl
+++ b/modules/imgproc/src/opencl/filterSepCol.cl
@@ -36,16 +36,6 @@
#define READ_TIMES_COL ((2*(RADIUSY+LSIZE1)-1)/LSIZE1)
#define RADIUS 1
-#if CN ==1
-#define ALIGN (((RADIUS)+3)>>2<<2)
-#elif CN==2
-#define ALIGN (((RADIUS)+1)>>1<<1)
-#elif CN==3
-#define ALIGN (((RADIUS)+3)>>2<<2)
-#elif CN==4
-#define ALIGN (RADIUS)
-#define READ_TIMES_ROW ((2*(RADIUS+LSIZE0)-1)/LSIZE0)
-#endif
#define noconvert
@@ -65,16 +55,8 @@ The info above maybe obsolete.
#define DIG(a) a,
__constant float mat_kernel[] = { COEFF };
-__kernel __attribute__((reqd_work_group_size(LSIZE0,LSIZE1,1))) void col_filter
- (__global const GENTYPE_SRC * restrict src,
- const int src_step_in_pixel,
- const int src_whole_cols,
- const int src_whole_rows,
- __global GENTYPE_DST * dst,
- const int dst_offset_in_pixel,
- const int dst_step_in_pixel,
- const int dst_cols,
- const int dst_rows)
+__kernel void col_filter(__global const srcT * src, int src_step_in_pixel, int src_whole_cols, int src_whole_rows,
+ __global dstT * dst, int dst_offset_in_pixel, int dst_step_in_pixel, int dst_cols, int dst_rows)
{
int x = get_global_id(0);
int y = get_global_id(1);
@@ -85,35 +67,35 @@ __kernel __attribute__((reqd_work_group_size(LSIZE0,LSIZE1,1))) void col_filter
int start_addr = mad24(y, src_step_in_pixel, x);
int end_addr = mad24(src_whole_rows - 1, src_step_in_pixel, src_whole_cols);
- int i;
- GENTYPE_SRC sum, temp[READ_TIMES_COL];
- __local GENTYPE_SRC LDS_DAT[LSIZE1 * READ_TIMES_COL][LSIZE0 + 1];
+ srcT sum, temp[READ_TIMES_COL];
+ __local srcT LDS_DAT[LSIZE1 * READ_TIMES_COL][LSIZE0 + 1];
- //read pixels from src
- for(i = 0;i>2<<2)
-#elif CN==2
-#define ALIGN (((RADIUS)+1)>>1<<1)
-#elif CN==3
-#define ALIGN (((RADIUS)+3)>>2<<2)
-#elif CN==4
-#define ALIGN (RADIUS)
-#endif
#ifdef BORDER_REPLICATE
-//BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
+// BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
#define ADDR_L(i, l_edge, r_edge) ((i) < (l_edge) ? (l_edge) : (i))
#define ADDR_R(i, r_edge, addr) ((i) >= (r_edge) ? (r_edge)-1 : (addr))
#endif
#ifdef BORDER_REFLECT
-//BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
+// BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
#define ADDR_L(i, l_edge, r_edge) ((i) < (l_edge) ? -(i)-1 : (i))
#define ADDR_R(i, r_edge, addr) ((i) >= (r_edge) ? -(i)-1+((r_edge)<<1) : (addr))
#endif
#ifdef BORDER_REFLECT_101
-//BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
+// BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
#define ADDR_L(i, l_edge, r_edge) ((i) < (l_edge) ? -(i) : (i))
#define ADDR_R(i, r_edge, addr) ((i) >= (r_edge) ? -(i)-2+((r_edge)<<1) : (addr))
#endif
-//blur function does not support BORDER_WRAP
#ifdef BORDER_WRAP
-//BORDER_WRAP: cdefgh|abcdefgh|abcdefg
+// BORDER_WRAP: cdefgh|abcdefgh|abcdefg
#define ADDR_L(i, l_edge, r_edge) ((i) < (l_edge) ? (i)+(r_edge) : (i))
#define ADDR_R(i, r_edge, addr) ((i) >= (r_edge) ? (i)-(r_edge) : (addr))
#endif
@@ -127,65 +115,56 @@
#endif //BORDER_CONSTANT
#endif //EXTRA_EXTRAPOLATION
-/**********************************************************************************
-These kernels are written for separable filters such as Sobel, Scharr, GaussianBlur.
-Now(6/29/2011) the kernels only support 8U data type and the anchor of the convovle
-kernel must be in the center. ROI is not supported either.
-For channels =1,2,4, each kernels read 4 elements(not 4 pixels), and for channels =3,
-the kernel read 4 pixels, save them to LDS and read the data needed from LDS to
-calculate the result.
-The length of the convovle kernel supported is related to the LSIZE0 and the MAX size
-of LDS, which is HW related.
-For channels = 1,3 the RADIUS is no more than LSIZE0*2
-For channels = 2, the RADIUS is no more than LSIZE0
-For channels = 4, arbitary RADIUS is supported unless the LDS is not enough
-Niko
-6/29/2011
-The info above maybe obsolete.
-***********************************************************************************/
+#define noconvert
+
+#if cn != 3
+#define loadpix(addr) *(__global const srcT *)(addr)
+#define storepix(val, addr) *(__global dstT *)(addr) = val
+#define SRCSIZE ((int)sizeof(srcT))
+#define DSTSIZE ((int)sizeof(dstT))
+#else
+#define loadpix(addr) vload3(0, (__global const srcT1 *)(addr))
+#define storepix(val, addr) vstore3(val, 0, (__global dstT1 *)(addr))
+#define SRCSIZE ((int)sizeof(srcT1)*3)
+#define DSTSIZE ((int)sizeof(dstT1)*3)
+#endif
#define DIG(a) a,
__constant float mat_kernel[] = { COEFF };
-__kernel __attribute__((reqd_work_group_size(LSIZE0,LSIZE1,1))) void row_filter_C1_D0
- (__global uchar * restrict src,
- int src_step_in_pixel,
- int src_offset_x, int src_offset_y,
- int src_cols, int src_rows,
- int src_whole_cols, int src_whole_rows,
- __global float * dst,
- int dst_step_in_pixel,
- int dst_cols, int dst_rows,
- int radiusy)
+__kernel void row_filter_C1_D0(__global const uchar * src, int src_step_in_pixel, int src_offset_x, int src_offset_y,
+ int src_cols, int src_rows, int src_whole_cols, int src_whole_rows,
+ __global float * dst, int dst_step_in_pixel, int dst_cols, int dst_rows,
+ int radiusy)
{
int x = get_global_id(0)<<2;
int y = get_global_id(1);
int l_x = get_local_id(0);
int l_y = get_local_id(1);
- int start_x = x+src_offset_x - RADIUSX & 0xfffffffc;
+ int start_x = x + src_offset_x - RADIUSX & 0xfffffffc;
int offset = src_offset_x - RADIUSX & 3;
int start_y = y + src_offset_y - radiusy;
int start_addr = mad24(start_y, src_step_in_pixel, start_x);
- int i;
+
float4 sum;
uchar4 temp[READ_TIMES_ROW];
- __local uchar4 LDS_DAT[LSIZE1][READ_TIMES_ROW*LSIZE0+1];
+ __local uchar4 LDS_DAT[LSIZE1][READ_TIMES_ROW * LSIZE0 + 1];
#ifdef BORDER_CONSTANT
int end_addr = mad24(src_whole_rows - 1, src_step_in_pixel, src_whole_cols);
// read pixels from src
- for (i = 0; i < READ_TIMES_ROW; i++)
+ for (int i = 0; i < READ_TIMES_ROW; ++i)
{
- int current_addr = start_addr+i*LSIZE0*4;
- current_addr = ((current_addr < end_addr) && (current_addr > 0)) ? current_addr : 0;
- temp[i] = *(__global uchar4*)&src[current_addr];
+ int current_addr = mad24(i, LSIZE0 << 2, start_addr);
+ current_addr = current_addr < end_addr && current_addr > 0 ? current_addr : 0;
+ temp[i] = *(__global const uchar4 *)&src[current_addr];
}
// judge if read out of boundary
#ifdef BORDER_ISOLATED
- for (i = 0; isrc_whole_cols)| (start_y<0) | (start_y >= src_whole_rows);
#endif
- int4 index[READ_TIMES_ROW];
- int4 addr;
+ int4 index[READ_TIMES_ROW], addr;
int s_y;
if (not_all_in_range)
{
// judge if read out of boundary
- for (i = 0; i < READ_TIMES_ROW; i++)
+ for (int i = 0; i < READ_TIMES_ROW; ++i)
{
- index[i] = (int4)(start_x+i*LSIZE0*4) + (int4)(0, 1, 2, 3);
+ index[i] = (int4)(mad24(i, LSIZE0 << 2, start_x)) + (int4)(0, 1, 2, 3);
#ifdef BORDER_ISOLATED
EXTRAPOLATE(index[i].x, src_offset_x, src_offset_x + src_cols);
EXTRAPOLATE(index[i].y, src_offset_x, src_offset_x + src_cols);
@@ -231,6 +209,7 @@ __kernel __attribute__((reqd_work_group_size(LSIZE0,LSIZE1,1))) void row_filter_
EXTRAPOLATE(index[i].w, 0, src_whole_cols);
#endif
}
+
s_y = start_y;
#ifdef BORDER_ISOLATED
EXTRAPOLATE(s_y, src_offset_y, src_offset_y + src_rows);
@@ -239,9 +218,9 @@ __kernel __attribute__((reqd_work_group_size(LSIZE0,LSIZE1,1))) void row_filter_
#endif
// read pixels from src
- for (i = 0; i 0)) ? current_addr : 0;
+ int current_addr = mad24(i, LSIZE0, start_addr);
+ current_addr = current_addr < end_addr && current_addr > 0 ? current_addr : 0;
temp[i] = src[current_addr];
}
- //judge if read out of boundary
+ // judge if read out of boundary
#ifdef BORDER_ISOLATED
- for (i = 0; i 0)) ? current_addr : 0;
- temp[i] = src[current_addr];
- }
-
- // judge if read out of boundary
-#ifdef BORDER_ISOLATED
- for (i = 0; i 0)) ? current_addr : 0;
- temp[i] = src[current_addr];
- }
-
- // judge if read out of boundary
-#ifdef BORDER_ISOLATED
- for (i = 0; i
Date: Wed, 19 Mar 2014 13:05:38 +0100
Subject: [PATCH 038/117] 1. fix an error in sample code 2. change an external
link to maintain consistency with the previous tutorial
---
.../mat_the_basic_image_container.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.rst b/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.rst
index 171d2e683f..ce65c0a42a 100644
--- a/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.rst
+++ b/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.rst
@@ -45,7 +45,7 @@ All the above objects, in the end, point to the same single data matrix. Their h
:linenos:
Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
- Mat E = A(Range:all(), Range(1,3)); // using row and column boundaries
+ Mat E = A(Range::all(), Range(1,3)); // using row and column boundaries
Now you may ask if the matrix itself may belong to multiple *Mat* objects who takes responsibility for cleaning it up when it's no longer needed. The short answer is: the last object that used it. This is handled by using a reference counting mechanism. Whenever somebody copies a header of a *Mat* object, a counter is increased for the matrix. Whenever a header is cleaned this counter is decreased. When the counter reaches zero the matrix too is freed. Sometimes you will want to copy the matrix itself too, so OpenCV provides the :basicstructures:`clone() ` and :basicstructures:`copyTo() ` functions.
@@ -86,7 +86,7 @@ Each of the building components has their own valid domains. This leads to the d
Creating a *Mat* object explicitly
==================================
-In the :ref:`Load_Save_Image` tutorial you have already learned how to write a matrix to an image file by using the :readWriteImageVideo:` imwrite() ` function. However, for debugging purposes it's much more convenient to see the actual values. You can do this using the << operator of *Mat*. Be aware that this only works for two dimensional matrices.
+In the :ref:`Load_Save_Image` tutorial you have already learned how to write a matrix to an image file by using the :imwrite:`imwrite() <>` function. However, for debugging purposes it's much more convenient to see the actual values. You can do this using the << operator of *Mat*. Be aware that this only works for two dimensional matrices.
Although *Mat* works really well as an image container, it is also a general matrix class. Therefore, it is possible to create and manipulate multidimensional matrices. You can create a Mat object in multiple ways:
From 30a8308f8e66fd46483cb193cac66665666a77fd Mon Sep 17 00:00:00 2001
From: Alexander Karsakov
Date: Wed, 19 Mar 2014 17:30:13 +0400
Subject: [PATCH 039/117] Enabled Intel-specific optimizations for HOG
detector.
---
modules/objdetect/src/hog.cpp | 16 +++++++++-------
modules/objdetect/src/opencl/objdetect_hog.cl | 18 +++++++++++++-----
2 files changed, 22 insertions(+), 12 deletions(-)
diff --git a/modules/objdetect/src/hog.cpp b/modules/objdetect/src/hog.cpp
index 18bb7afc22..0f4456ad51 100644
--- a/modules/objdetect/src/hog.cpp
+++ b/modules/objdetect/src/hog.cpp
@@ -1085,8 +1085,8 @@ static bool ocl_compute_gradients_8UC1(int height, int width, InputArray _img, f
size_t globalThreads[3] = { width, height, 1 };
char correctGamma = (correct_gamma) ? 1 : 0;
int grad_quadstep = (int)grad.step >> 3;
- int qangle_step_shift = 0;
- int qangle_step = (int)qangle.step >> (1 + qangle_step_shift);
+ int qangle_elem_size = CV_ELEM_SIZE1(qangle.type());
+ int qangle_step = (int)qangle.step / (2 * qangle_elem_size);
int idx = 0;
idx = k.set(idx, height);
@@ -1137,9 +1137,9 @@ static bool ocl_compute_hists(int nbins, int block_stride_x, int block_stride_y,
int img_block_height = (height - CELLS_PER_BLOCK_Y * CELL_HEIGHT + block_stride_y)/block_stride_y;
int blocks_total = img_block_width * img_block_height;
- int qangle_step_shift = 0;
+ int qangle_elem_size = CV_ELEM_SIZE1(qangle.type());
int grad_quadstep = (int)grad.step >> 2;
- int qangle_step = (int)qangle.step >> qangle_step_shift;
+ int qangle_step = (int)qangle.step / qangle_elem_size;
int blocks_in_group = 4;
size_t localThreads[3] = { blocks_in_group * 24, 2, 1 };
@@ -1316,11 +1316,12 @@ static bool ocl_extract_descrs_by_cols(int win_height, int win_width, int block_
static bool ocl_compute(InputArray _img, Size win_stride, std::vector& _descriptors, int descr_format, Size blockSize,
Size cellSize, int nbins, Size blockStride, Size winSize, float sigma, bool gammaCorrection, double L2HysThreshold)
{
- Size imgSize = _img.size();
+ Size imgSize = _img.size();
Size effect_size = imgSize;
UMat grad(imgSize, CV_32FC2);
- UMat qangle(imgSize, CV_8UC2);
+ int qangle_type = ocl::Device::getDefault().isIntel() ? CV_32SC2 : CV_8UC2;
+ UMat qangle(imgSize, qangle_type);
const size_t block_hist_size = getBlockHistogramSize(blockSize, cellSize, nbins);
const Size blocks_per_img = numPartsWithin(imgSize, blockSize, blockStride);
@@ -1720,7 +1721,8 @@ static bool ocl_detect(InputArray img, std::vector &hits, double hit_thre
Size imgSize = img.size();
Size effect_size = imgSize;
UMat grad(imgSize, CV_32FC2);
- UMat qangle(imgSize, CV_8UC2);
+ int qangle_type = ocl::Device::getDefault().isIntel() ? CV_32SC2 : CV_8UC2;
+ UMat qangle(imgSize, qangle_type);
const size_t block_hist_size = getBlockHistogramSize(blockSize, cellSize, nbins);
const Size blocks_per_img = numPartsWithin(imgSize, blockSize, blockStride);
diff --git a/modules/objdetect/src/opencl/objdetect_hog.cl b/modules/objdetect/src/opencl/objdetect_hog.cl
index 082f9ab7fb..5c71aa1b45 100644
--- a/modules/objdetect/src/opencl/objdetect_hog.cl
+++ b/modules/objdetect/src/opencl/objdetect_hog.cl
@@ -50,6 +50,14 @@
#define NTHREADS 256
#define CV_PI_F 3.1415926535897932384626433832795f
+#ifdef INTEL_DEVICE
+#define QANGLE_TYPE int
+#define QANGLE_TYPE2 int2
+#else
+#define QANGLE_TYPE uchar
+#define QANGLE_TYPE2 uchar2
+#endif
+
//----------------------------------------------------------------------------
// Histogram computation
// 12 threads for a cell, 12x4 threads per block
@@ -59,7 +67,7 @@ __kernel void compute_hists_lut_kernel(
const int cnbins, const int cblock_hist_size, const int img_block_width,
const int blocks_in_group, const int blocks_total,
const int grad_quadstep, const int qangle_step,
- __global const float* grad, __global const uchar* qangle,
+ __global const float* grad, __global const QANGLE_TYPE* qangle,
__global const float* gauss_w_lut,
__global float* block_hists, __local float* smem)
{
@@ -86,7 +94,7 @@ __kernel void compute_hists_lut_kernel(
__global const float* grad_ptr = (gid < blocks_total) ?
grad + offset_y * grad_quadstep + (offset_x << 1) : grad;
- __global const uchar* qangle_ptr = (gid < blocks_total) ?
+ __global const QANGLE_TYPE* qangle_ptr = (gid < blocks_total) ?
qangle + offset_y * qangle_step + (offset_x << 1) : qangle;
__local float* hist = hists + 12 * (cell_y * CELLS_PER_BLOCK_Y + cell_x) +
@@ -101,7 +109,7 @@ __kernel void compute_hists_lut_kernel(
for (int dist_y = dist_y_begin; dist_y < dist_y_begin + 12; ++dist_y)
{
float2 vote = (float2) (grad_ptr[0], grad_ptr[1]);
- uchar2 bin = (uchar2) (qangle_ptr[0], qangle_ptr[1]);
+ QANGLE_TYPE2 bin = (QANGLE_TYPE2) (qangle_ptr[0], qangle_ptr[1]);
grad_ptr += grad_quadstep;
qangle_ptr += qangle_step;
@@ -558,7 +566,7 @@ __kernel void extract_descrs_by_cols_kernel(
__kernel void compute_gradients_8UC4_kernel(
const int height, const int width,
const int img_step, const int grad_quadstep, const int qangle_step,
- const __global uchar4 * img, __global float * grad, __global uchar * qangle,
+ const __global uchar4 * img, __global float * grad, __global QANGLE_TYPE * qangle,
const float angle_scale, const char correct_gamma, const int cnbins)
{
const int x = get_global_id(0);
@@ -660,7 +668,7 @@ __kernel void compute_gradients_8UC4_kernel(
__kernel void compute_gradients_8UC1_kernel(
const int height, const int width,
const int img_step, const int grad_quadstep, const int qangle_step,
- __global const uchar * img, __global float * grad, __global uchar * qangle,
+ __global const uchar * img, __global float * grad, __global QANGLE_TYPE * qangle,
const float angle_scale, const char correct_gamma, const int cnbins)
{
const int x = get_global_id(0);
From 284b2fc1e735886c569685333d558f624ce58719 Mon Sep 17 00:00:00 2001
From: Alexander Smorkalov
Date: Fri, 28 Feb 2014 18:18:20 +0400
Subject: [PATCH 040/117] Cut path to CUDA libraries to prevent generation of
OpenCVModules.cmake with abs path.
---
CMakeLists.txt | 11 ---------
cmake/OpenCVDetectAndroidSDK.cmake | 6 ++---
cmake/OpenCVDetectCUDA.cmake | 39 ++++++++++++++++++++++++++++++
3 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fb49497412..747d207e36 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -467,7 +467,6 @@ include(cmake/OpenCVFindLibsGUI.cmake)
include(cmake/OpenCVFindLibsVideo.cmake)
include(cmake/OpenCVFindLibsPerf.cmake)
-
# ----------------------------------------------------------------------------
# Detect other 3rd-party libraries/tools
# ----------------------------------------------------------------------------
@@ -513,16 +512,6 @@ if(NOT HAVE_CUDA)
set(ENABLE_DYNAMIC_CUDA OFF)
endif()
-if(HAVE_CUDA AND NOT ENABLE_DYNAMIC_CUDA)
- set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CUDA_LIBRARIES} ${CUDA_npp_LIBRARY})
- if(HAVE_CUBLAS)
- set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CUDA_cublas_LIBRARY})
- endif()
- if(HAVE_CUFFT)
- set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${CUDA_cufft_LIBRARY})
- endif()
-endif()
-
# ----------------------------------------------------------------------------
# Solution folders:
# ----------------------------------------------------------------------------
diff --git a/cmake/OpenCVDetectAndroidSDK.cmake b/cmake/OpenCVDetectAndroidSDK.cmake
index af7427194e..273758967c 100644
--- a/cmake/OpenCVDetectAndroidSDK.cmake
+++ b/cmake/OpenCVDetectAndroidSDK.cmake
@@ -326,12 +326,12 @@ macro(add_android_project target path)
# copy all needed CUDA libs to project if EMBED_CUDA flag is present
if(android_proj_EMBED_CUDA)
- set(android_proj_culibs ${CUDA_npp_LIBRARY} ${CUDA_LIBRARIES})
+ set(android_proj_culibs ${CUDA_npp_LIBRARY_ABS} ${CUDA_LIBRARIES_ABS})
if(HAVE_CUFFT)
- list(INSERT android_proj_culibs 0 ${CUDA_cufft_LIBRARY})
+ list(INSERT android_proj_culibs 0 ${CUDA_cufft_LIBRARY_ABS})
endif()
if(HAVE_CUBLAS)
- list(INSERT android_proj_culibs 0 ${CUDA_cublas_LIBRARY})
+ list(INSERT android_proj_culibs 0 ${CUDA_cublas_LIBRARY_ABS})
endif()
foreach(lib ${android_proj_culibs})
get_filename_component(f "${lib}" NAME)
diff --git a/cmake/OpenCVDetectCUDA.cmake b/cmake/OpenCVDetectCUDA.cmake
index 56b142970e..24fbb03ce3 100644
--- a/cmake/OpenCVDetectCUDA.cmake
+++ b/cmake/OpenCVDetectCUDA.cmake
@@ -219,3 +219,42 @@ else()
unset(CUDA_ARCH_BIN CACHE)
unset(CUDA_ARCH_PTX CACHE)
endif()
+
+if(HAVE_CUDA)
+ set(CUDA_LIBS_PATH "")
+ foreach(p ${CUDA_LIBRARIES} ${CUDA_npp_LIBRARY})
+ get_filename_component(_tmp ${p} PATH)
+ list(APPEND CUDA_LIBS_PATH ${_tmp})
+ endforeach()
+
+ if(HAVE_CUBLAS)
+ foreach(p ${CUDA_cublas_LIBRARY})
+ get_filename_component(_tmp ${p} PATH)
+ list(APPEND CUDA_LIBS_PATH ${_tmp})
+ endforeach()
+ endif()
+
+ if(HAVE_CUFFT)
+ foreach(p ${CUDA_cufft_LIBRARY})
+ get_filename_component(_tmp ${p} PATH)
+ list(APPEND CUDA_LIBS_PATH ${_tmp})
+ endforeach()
+ endif()
+
+ list(REMOVE_DUPLICATES CUDA_LIBS_PATH)
+ link_directories(${CUDA_LIBS_PATH})
+
+ set(CUDA_LIBRARIES_ABS ${CUDA_LIBRARIES})
+ ocv_convert_to_lib_name(CUDA_LIBRARIES ${CUDA_LIBRARIES})
+ set(CUDA_npp_LIBRARY_ABS ${CUDA_npp_LIBRARY})
+ ocv_convert_to_lib_name(CUDA_npp_LIBRARY ${CUDA_npp_LIBRARY})
+ if(HAVE_CUBLAS)
+ set(CUDA_cublas_LIBRARY_ABS ${CUDA_cublas_LIBRARY})
+ ocv_convert_to_lib_name(CUDA_cublas_LIBRARY ${CUDA_cublas_LIBRARY})
+ endif()
+
+ if(HAVE_CUFFT)
+ set(CUDA_cufft_LIBRARY_ABS ${CUDA_cufft_LIBRARY})
+ ocv_convert_to_lib_name(CUDA_cufft_LIBRARY ${CUDA_cufft_LIBRARY})
+ endif()
+endif()
\ No newline at end of file
From 291458a8599d513eff1729ef8c0fcab89187621d Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Wed, 19 Mar 2014 18:49:33 +0400
Subject: [PATCH 041/117] generalized OpenCL version of cv::sepFilter2D;
removed some restrictions and added 3-channels support
---
modules/core/src/ocl.cpp | 4 +-
modules/imgproc/src/filter.cpp | 86 +++++++++++--------
modules/imgproc/src/opencl/filterSepCol.cl | 47 +++++-----
modules/imgproc/src/opencl/filterSepRow.cl | 45 ++++++----
modules/imgproc/test/ocl/test_filters.cpp | 2 +-
modules/imgproc/test/ocl/test_sepfilter2D.cpp | 17 ++--
6 files changed, 112 insertions(+), 89 deletions(-)
diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp
index b56f84c16e..3a7c718d4f 100644
--- a/modules/core/src/ocl.cpp
+++ b/modules/core/src/ocl.cpp
@@ -4317,8 +4317,8 @@ String kernelToStr(InputArray _kernel, int ddepth, const char * name)
if (ddepth != depth)
kernel.convertTo(kernel, ddepth);
- typedef std::string (*func_t)(const Mat &);
- static const func_t funcs[] = { kerToStr, kerToStr, kerToStr,kerToStr,
+ typedef std::string (* func_t)(const Mat &);
+ static const func_t funcs[] = { kerToStr, kerToStr, kerToStr, kerToStr,
kerToStr, kerToStr, kerToStr, 0 };
const func_t func = funcs[depth];
CV_Assert(func != 0);
diff --git a/modules/imgproc/src/filter.cpp b/modules/imgproc/src/filter.cpp
index ba2e347af0..c013a9b16c 100644
--- a/modules/imgproc/src/filter.cpp
+++ b/modules/imgproc/src/filter.cpp
@@ -41,7 +41,6 @@
//M*/
#include "precomp.hpp"
-#define CV_OPENCL_RUN_ASSERT
#include "opencl_kernels.hpp"
#include
@@ -3135,7 +3134,7 @@ template struct Filter2D : public BaseFi
// b e h b e h 0 0
// c f i c f i 0 0
template
-static int _prepareKernelFilter2D(std::vector& data, const Mat &kernel)
+static int _prepareKernelFilter2D(std::vector & data, const Mat & kernel)
{
Mat _kernel; kernel.convertTo(_kernel, DataDepth::value);
int size_y_aligned = ROUNDUP(kernel.rows * 2, 4);
@@ -3318,11 +3317,16 @@ static bool ocl_filter2D( InputArray _src, OutputArray _dst, int ddepth,
return kernel.run(2, globalsize, localsize, true);
}
-static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor, int borderType)
+static bool ocl_sepRowFilter2D(const UMat & src, UMat & buf, const Mat & kernelX, int anchor,
+ int borderType, int ddepth, bool fast8uc1)
{
int type = src.type(), cn = CV_MAT_CN(type), sdepth = CV_MAT_DEPTH(type);
+ bool doubleSupport = ocl::Device::getDefault().doubleFPConfig() > 0;
Size bufSize = buf.size();
+ if (!doubleSupport && (sdepth == CV_64F || ddepth == CV_64F))
+ return false;
+
#ifdef ANDROID
size_t localsize[2] = {16, 10};
#else
@@ -3330,7 +3334,7 @@ static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor,
#endif
size_t globalsize[2] = {DIVUP(bufSize.width, localsize[0]) * localsize[0], DIVUP(bufSize.height, localsize[1]) * localsize[1]};
- if (type == CV_8UC1)
+ if (fast8uc1)
globalsize[0] = DIVUP((bufSize.width + 3) >> 2, localsize[0]) * localsize[0];
int radiusX = anchor, radiusY = (buf.rows - src.rows) >> 1;
@@ -3346,20 +3350,21 @@ static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor,
char cvt[40];
cv::String build_options = cv::format("-D RADIUSX=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D %s -D %s"
- " -D srcT=%s -D dstT=%s -D convertToDstT=%s -D srcT1=%s -D dstT1=%s",
+ " -D srcT=%s -D dstT=%s -D convertToDstT=%s -D srcT1=%s -D dstT1=%s%s",
radiusX, (int)localsize[0], (int)localsize[1], cn, btype,
extra_extrapolation ? "EXTRA_EXTRAPOLATION" : "NO_EXTRA_EXTRAPOLATION",
isolated ? "BORDER_ISOLATED" : "NO_BORDER_ISOLATED",
ocl::typeToStr(type), ocl::typeToStr(CV_32FC(cn)),
ocl::convertTypeStr(sdepth, CV_32F, cn, cvt),
- ocl::typeToStr(sdepth), ocl::typeToStr(CV_32F));
+ ocl::typeToStr(sdepth), ocl::typeToStr(CV_32F),
+ doubleSupport ? " -D DOUBLE_SUPPORT" : "");
build_options += ocl::kernelToStr(kernelX, CV_32F);
Size srcWholeSize; Point srcOffset;
src.locateROI(srcWholeSize, srcOffset);
String kernelName("row_filter");
- if (type == CV_8UC1)
+ if (fast8uc1)
kernelName += "_C1_D0";
ocl::Kernel k(kernelName.c_str(), cv::ocl::imgproc::filterSepRow_oclsrc,
@@ -3367,39 +3372,47 @@ static bool ocl_sepRowFilter2D( UMat &src, UMat &buf, Mat &kernelX, int anchor,
if (k.empty())
return false;
- k.args(ocl::KernelArg::PtrReadOnly(src), (int)(src.step / src.elemSize()), srcOffset.x,
- srcOffset.y, src.cols, src.rows, srcWholeSize.width, srcWholeSize.height,
- ocl::KernelArg::PtrWriteOnly(buf), (int)(buf.step / buf.elemSize()),
- buf.cols, buf.rows, radiusY);
+ if (fast8uc1)
+ k.args(ocl::KernelArg::PtrReadOnly(src), (int)(src.step / src.elemSize()), srcOffset.x,
+ srcOffset.y, src.cols, src.rows, srcWholeSize.width, srcWholeSize.height,
+ ocl::KernelArg::PtrWriteOnly(buf), (int)(buf.step / buf.elemSize()),
+ buf.cols, buf.rows, radiusY);
+ else
+ k.args(ocl::KernelArg::PtrReadOnly(src), (int)src.step, srcOffset.x,
+ srcOffset.y, src.cols, src.rows, srcWholeSize.width, srcWholeSize.height,
+ ocl::KernelArg::PtrWriteOnly(buf), (int)buf.step, buf.cols, buf.rows, radiusY);
return k.run(2, globalsize, localsize, false);
}
-static bool ocl_sepColFilter2D(const UMat &buf, UMat &dst, Mat &kernelY, int anchor)
+static bool ocl_sepColFilter2D(const UMat & buf, UMat & dst, const Mat & kernelY, int anchor)
{
+ bool doubleSupport = ocl::Device::getDefault().doubleFPConfig() > 0;
+ if (dst.depth() == CV_64F && !doubleSupport)
+ return false;
+
#ifdef ANDROID
- size_t localsize[2] = {16, 10};
+ size_t localsize[2] = { 16, 10 };
#else
- size_t localsize[2] = {16, 16};
+ size_t localsize[2] = { 16, 16 };
#endif
- size_t globalsize[2] = {0, 0};
+ size_t globalsize[2] = { 0, 0 };
int dtype = dst.type(), cn = CV_MAT_CN(dtype), ddepth = CV_MAT_DEPTH(dtype);
Size sz = dst.size();
globalsize[1] = DIVUP(sz.height, localsize[1]) * localsize[1];
-
- if (dtype == CV_8UC2)
- globalsize[0] = DIVUP((sz.width + 1) / 2, localsize[0]) * localsize[0];
- else
- globalsize[0] = DIVUP(sz.width, localsize[0]) * localsize[0];
+ globalsize[0] = DIVUP(sz.width, localsize[0]) * localsize[0];
char cvt[40];
cv::String build_options = cv::format("-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d"
- " -D srcT=%s -D dstT=%s -D convertToDstT=%s",
+ " -D srcT=%s -D dstT=%s -D convertToDstT=%s"
+ " -D srcT1=%s -D dstT1=%s%s",
anchor, (int)localsize[0], (int)localsize[1], cn,
ocl::typeToStr(buf.type()), ocl::typeToStr(dtype),
- ocl::convertTypeStr(CV_32F, ddepth, cn, cvt));
+ ocl::convertTypeStr(CV_32F, ddepth, cn, cvt),
+ ocl::typeToStr(CV_32F), ocl::typeToStr(ddepth),
+ doubleSupport ? " -D DOUBLE_SUPPORT" : "");
build_options += ocl::kernelToStr(kernelY, CV_32F);
ocl::Kernel k("col_filter", cv::ocl::imgproc::filterSepCol_oclsrc,
@@ -3407,13 +3420,13 @@ static bool ocl_sepColFilter2D(const UMat &buf, UMat &dst, Mat &kernelY, int anc
if (k.empty())
return false;
- k.args(ocl::KernelArg::PtrReadOnly(buf), (int)(buf.step / buf.elemSize()), buf.cols,
- buf.rows, ocl::KernelArg::PtrWriteOnly(dst), (int)(dst.offset / dst.elemSize()),
- (int)(dst.step / dst.elemSize()), dst.cols, dst.rows);
+ k.args(ocl::KernelArg::ReadOnly(buf), ocl::KernelArg::WriteOnly(dst));
return k.run(2, globalsize, localsize, false);
}
+#if 0
+
const int optimizedSepFilterLocalSize = 16;
static bool ocl_sepFilter2D_SinglePass(InputArray _src, OutputArray _dst,
@@ -3471,18 +3484,19 @@ static bool ocl_sepFilter2D_SinglePass(InputArray _src, OutputArray _dst,
return k.run(2, gt2, lt2, false);
}
+#endif
+
static bool ocl_sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
InputArray _kernelX, InputArray _kernelY, Point anchor,
double delta, int borderType )
{
- Size imgSize = _src.size();
+// Size imgSize = _src.size();
if (abs(delta)> FLT_MIN)
return false;
int type = _src.type(), cn = CV_MAT_CN(type);
- if ( !( (type == CV_8UC1 || type == CV_8UC4 || type == CV_32FC1 || type == CV_32FC4) &&
- (ddepth == CV_32F || ddepth == CV_16S || ddepth == CV_8U || ddepth < 0) ) )
+ if (cn > 4)
return false;
Mat kernelX = _kernelX.getMat().reshape(1, 1);
@@ -3501,9 +3515,6 @@ static bool ocl_sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
if (ddepth < 0)
ddepth = sdepth;
-// printf("%d %d\n", imgSize.width, optimizedSepFilterLocalSize + (kernelX.rows >> 1));
-// printf("%d %d\n", imgSize.height, optimizedSepFilterLocalSize + (kernelY.rows >> 1));
-
// CV_OCL_RUN_(kernelY.rows <= 21 && kernelX.rows <= 21 &&
// imgSize.width > optimizedSepFilterLocalSize + (kernelX.rows >> 1) &&
// imgSize.height > optimizedSepFilterLocalSize + (kernelY.rows >> 1),
@@ -3512,20 +3523,19 @@ static bool ocl_sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
UMat src = _src.getUMat();
Size srcWholeSize; Point srcOffset;
src.locateROI(srcWholeSize, srcOffset);
- if ( (0 != (srcOffset.x % 4)) ||
- (0 != (src.cols % 4)) ||
- (0 != ((src.step / src.elemSize()) % 4))
- )
- return false;
+
+ bool fast8uc1 = type == CV_8UC1 && srcOffset.x % 4 == 0 &&
+ src.cols % 4 == 0 && src.step % 4 == 0;
Size srcSize = src.size();
Size bufSize(srcSize.width, srcSize.height + kernelY.cols - 1);
- UMat buf; buf.create(bufSize, CV_MAKETYPE(CV_32F, cn));
- if (!ocl_sepRowFilter2D(src, buf, kernelX, anchor.x, borderType))
+ UMat buf(bufSize, CV_32FC(cn));
+ if (!ocl_sepRowFilter2D(src, buf, kernelX, anchor.x, borderType, ddepth, fast8uc1))
return false;
_dst.create(srcSize, CV_MAKETYPE(ddepth, cn));
UMat dst = _dst.getUMat();
+
return ocl_sepColFilter2D(buf, dst, kernelY, anchor.y);
}
diff --git a/modules/imgproc/src/opencl/filterSepCol.cl b/modules/imgproc/src/opencl/filterSepCol.cl
index 05717c6ad2..f5d270cf42 100644
--- a/modules/imgproc/src/opencl/filterSepCol.cl
+++ b/modules/imgproc/src/opencl/filterSepCol.cl
@@ -34,29 +34,36 @@
//
//
+#ifdef DOUBLE_SUPPORT
+#ifdef cl_amd_fp64
+#pragma OPENCL EXTENSION cl_amd_fp64:enable
+#elif defined (cl_khr_fp64)
+#pragma OPENCL EXTENSION cl_khr_fp64:enable
+#endif
+#endif
+
#define READ_TIMES_COL ((2*(RADIUSY+LSIZE1)-1)/LSIZE1)
#define RADIUS 1
#define noconvert
-/**********************************************************************************
-These kernels are written for separable filters such as Sobel, Scharr, GaussianBlur.
-Now(6/29/2011) the kernels only support 8U data type and the anchor of the convovle
-kernel must be in the center. ROI is not supported either.
-Each kernels read 4 elements(not 4 pixels), save them to LDS and read the data needed
-from LDS to calculate the result.
-The length of the convovle kernel supported is only related to the MAX size of LDS,
-which is HW related.
-Niko
-6/29/2011
-The info above maybe obsolete.
-***********************************************************************************/
+#if CN != 3
+#define loadpix(addr) *(__global const srcT *)(addr)
+#define storepix(val, addr) *(__global dstT *)(addr) = val
+#define SRCSIZE (int)sizeof(srcT)
+#define DSTSIZE (int)sizeof(dstT)
+#else
+#define loadpix(addr) vload3(0, (__global const srcT1 *)(addr))
+#define storepix(val, addr) vstore3(val, 0, (__global dstT1 *)(addr))
+#define SRCSIZE (int)sizeof(srcT1)*3
+#define DSTSIZE (int)sizeof(dstT1)*3
+#endif
#define DIG(a) a,
__constant float mat_kernel[] = { COEFF };
-__kernel void col_filter(__global const srcT * src, int src_step_in_pixel, int src_whole_cols, int src_whole_rows,
- __global dstT * dst, int dst_offset_in_pixel, int dst_step_in_pixel, int dst_cols, int dst_rows)
+__kernel void col_filter(__global const uchar * src, int src_step, int src_offset, int src_whole_rows, int src_whole_cols,
+ __global uchar * dst, int dst_step, int dst_offset, int dst_rows, int dst_cols)
{
int x = get_global_id(0);
int y = get_global_id(1);
@@ -64,8 +71,8 @@ __kernel void col_filter(__global const srcT * src, int src_step_in_pixel, int s
int l_x = get_local_id(0);
int l_y = get_local_id(1);
- int start_addr = mad24(y, src_step_in_pixel, x);
- int end_addr = mad24(src_whole_rows - 1, src_step_in_pixel, src_whole_cols);
+ int start_addr = mad24(y, src_step, x * SRCSIZE);
+ int end_addr = mad24(src_whole_rows - 1, src_step, src_whole_cols * SRCSIZE);
srcT sum, temp[READ_TIMES_COL];
__local srcT LDS_DAT[LSIZE1 * READ_TIMES_COL][LSIZE0 + 1];
@@ -73,9 +80,9 @@ __kernel void col_filter(__global const srcT * src, int src_step_in_pixel, int s
// read pixels from src
for (int i = 0; i < READ_TIMES_COL; ++i)
{
- int current_addr = mad24(i, LSIZE1 * src_step_in_pixel, start_addr);
+ int current_addr = mad24(i, LSIZE1 * src_step, start_addr);
current_addr = current_addr < end_addr ? current_addr : 0;
- temp[i] = src[current_addr];
+ temp[i] = loadpix(src + current_addr);
}
// save pixels to lds
@@ -95,7 +102,7 @@ __kernel void col_filter(__global const srcT * src, int src_step_in_pixel, int s
// write the result to dst
if (x < dst_cols && y < dst_rows)
{
- start_addr = mad24(y, dst_step_in_pixel, x + dst_offset_in_pixel);
- dst[start_addr] = convertToDstT(sum);
+ start_addr = mad24(y, dst_step, mad24(DSTSIZE, x, dst_offset));
+ storepix(convertToDstT(sum), dst + start_addr);
}
}
diff --git a/modules/imgproc/src/opencl/filterSepRow.cl b/modules/imgproc/src/opencl/filterSepRow.cl
index 83968dfc1e..726de448e4 100644
--- a/modules/imgproc/src/opencl/filterSepRow.cl
+++ b/modules/imgproc/src/opencl/filterSepRow.cl
@@ -34,6 +34,14 @@
//
//
+#ifdef DOUBLE_SUPPORT
+#ifdef cl_amd_fp64
+#pragma OPENCL EXTENSION cl_amd_fp64:enable
+#elif defined (cl_khr_fp64)
+#pragma OPENCL EXTENSION cl_khr_fp64:enable
+#endif
+#endif
+
#define READ_TIMES_ROW ((2*(RADIUSX+LSIZE0)-1)/LSIZE0) //for c4 only
#define RADIUS 1
@@ -117,16 +125,16 @@
#define noconvert
-#if cn != 3
+#if CN != 3
#define loadpix(addr) *(__global const srcT *)(addr)
#define storepix(val, addr) *(__global dstT *)(addr) = val
-#define SRCSIZE ((int)sizeof(srcT))
-#define DSTSIZE ((int)sizeof(dstT))
+#define SRCSIZE (int)sizeof(srcT)
+#define DSTSIZE (int)sizeof(dstT)
#else
#define loadpix(addr) vload3(0, (__global const srcT1 *)(addr))
#define storepix(val, addr) vstore3(val, 0, (__global dstT1 *)(addr))
-#define SRCSIZE ((int)sizeof(srcT1)*3)
-#define DSTSIZE ((int)sizeof(dstT1)*3)
+#define SRCSIZE (int)sizeof(srcT1)*3
+#define DSTSIZE (int)sizeof(dstT1)*3
#endif
#define DIG(a) a,
@@ -269,32 +277,33 @@ __kernel void row_filter_C1_D0(__global const uchar * src, int src_step_in_pixel
dst[start_addr] = sum.x;
}
-__kernel void row_filter(__global const srcT * src, int src_step_in_pixel, int src_offset_x, int src_offset_y,
+__kernel void row_filter(__global const uchar * src, int src_step, int src_offset_x, int src_offset_y,
int src_cols, int src_rows, int src_whole_cols, int src_whole_rows,
- __global dstT * dst, int dst_step_in_pixel, int dst_cols, int dst_rows,
+ __global uchar * dst, int dst_step, int dst_cols, int dst_rows,
int radiusy)
{
int x = get_global_id(0);
int y = get_global_id(1);
int l_x = get_local_id(0);
int l_y = get_local_id(1);
+
int start_x = x + src_offset_x - RADIUSX;
int start_y = y + src_offset_y - radiusy;
- int start_addr = mad24(start_y, src_step_in_pixel, start_x);
+ int start_addr = mad24(start_y, src_step, start_x * SRCSIZE);
dstT sum;
srcT temp[READ_TIMES_ROW];
__local srcT LDS_DAT[LSIZE1][READ_TIMES_ROW * LSIZE0 + 1];
#ifdef BORDER_CONSTANT
- int end_addr = mad24(src_whole_rows - 1, src_step_in_pixel, src_whole_cols);
+ int end_addr = mad24(src_whole_rows - 1, src_step, src_whole_cols * SRCSIZE);
// read pixels from src
for (int i = 0; i < READ_TIMES_ROW; i++)
{
- int current_addr = mad24(i, LSIZE0, start_addr);
- current_addr = current_addr < end_addr && current_addr > 0 ? current_addr : 0;
- temp[i] = src[current_addr];
+ int current_addr = mad24(i, LSIZE0 * SRCSIZE, start_addr);
+ current_addr = current_addr < end_addr && current_addr >= 0 ? current_addr : 0;
+ temp[i] = loadpix(src + current_addr);
}
// judge if read out of boundary
@@ -312,8 +321,7 @@ __kernel void row_filter(__global const srcT * src, int src_step_in_pixel, int s
}
#endif
#else
- int index[READ_TIMES_ROW];
- int s_x, s_y;
+ int index[READ_TIMES_ROW], s_x, s_y;
// judge if read out of boundary
for (int i = 0; i < READ_TIMES_ROW; ++i)
@@ -328,12 +336,12 @@ __kernel void row_filter(__global const srcT * src, int src_step_in_pixel, int s
EXTRAPOLATE(s_x, 0, src_whole_cols);
EXTRAPOLATE(s_y, 0, src_whole_rows);
#endif
- index[i] = mad24(s_y, src_step_in_pixel, s_x);
+ index[i] = mad24(s_y, src_step, s_x * SRCSIZE);
}
// read pixels from src
for (int i = 0; i < READ_TIMES_ROW; ++i)
- temp[i] = src[index[i]];
+ temp[i] = loadpix(src + index[i]);
#endif // BORDER_CONSTANT
// save pixels to lds
@@ -349,10 +357,11 @@ __kernel void row_filter(__global const srcT * src, int src_step_in_pixel, int s
temp[1] = LDS_DAT[l_y][l_x + RADIUSX + i];
sum += mad(convertToDstT(temp[0]), mat_kernel[RADIUSX - i], convertToDstT(temp[1]) * mat_kernel[RADIUSX + i]);
}
+
// write the result to dst
if (x < dst_cols && y < dst_rows)
{
- start_addr = mad24(y, dst_step_in_pixel, x);
- dst[start_addr] = sum;
+ start_addr = mad24(y, dst_step, x * DSTSIZE);
+ storepix(sum, dst + start_addr);
}
}
diff --git a/modules/imgproc/test/ocl/test_filters.cpp b/modules/imgproc/test/ocl/test_filters.cpp
index fe16fe81d5..04b330527f 100644
--- a/modules/imgproc/test/ocl/test_filters.cpp
+++ b/modules/imgproc/test/ocl/test_filters.cpp
@@ -312,7 +312,7 @@ OCL_TEST_P(MorphologyEx, Mat)
(int)BORDER_REFLECT|BORDER_ISOLATED, (int)BORDER_WRAP|BORDER_ISOLATED, \
(int)BORDER_REFLECT_101|BORDER_ISOLATED*/) // WRAP and ISOLATED are not supported by cv:: version
-#define FILTER_TYPES Values(CV_8UC1, CV_8UC2, CV_8UC4, CV_32FC1, CV_32FC4, CV_64FC1, CV_64FC4)
+#define FILTER_TYPES Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4)
OCL_INSTANTIATE_TEST_CASE_P(Filter, Bilateral, Combine(
Values((MatType)CV_8UC1),
diff --git a/modules/imgproc/test/ocl/test_sepfilter2D.cpp b/modules/imgproc/test/ocl/test_sepfilter2D.cpp
index 09d01d157a..05d46cc2b3 100644
--- a/modules/imgproc/test/ocl/test_sepfilter2D.cpp
+++ b/modules/imgproc/test/ocl/test_sepfilter2D.cpp
@@ -75,9 +75,9 @@ PARAM_TEST_CASE(SepFilter2D, MatDepth, Channels, BorderType, bool, bool)
void random_roi()
{
Size ksize = randomSize(kernelMinSize, kernelMaxSize);
- if (1 != (ksize.width % 2))
+ if (1 != ksize.width % 2)
ksize.width++;
- if (1 != (ksize.height % 2))
+ if (1 != ksize.height % 2)
ksize.height++;
Mat temp = randomMat(Size(ksize.width, 1), CV_MAKE_TYPE(CV_32F, 1), -MAX_VALUE, MAX_VALUE);
@@ -86,24 +86,22 @@ PARAM_TEST_CASE(SepFilter2D, MatDepth, Channels, BorderType, bool, bool)
cv::normalize(temp, kernelY, 1.0, 0.0, NORM_L1);
Size roiSize = randomSize(ksize.width + 16, MAX_VALUE, ksize.height + 20, MAX_VALUE);
- std::cout << roiSize << std::endl;
int rest = roiSize.width % 4;
- if (0 != rest)
+ if (rest != 0)
roiSize.width += (4 - rest);
Border srcBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
rest = srcBorder.lef % 4;
- if (0 != rest)
+ if (rest != 0)
srcBorder.lef += (4 - rest);
rest = srcBorder.rig % 4;
- if (0 != rest)
+ if (rest != 0)
srcBorder.rig += (4 - rest);
randomSubMat(src, src_roi, roiSize, srcBorder, type, -MAX_VALUE, MAX_VALUE);
Border dstBorder = randomBorder(0, useRoi ? MAX_VALUE : 0);
randomSubMat(dst, dst_roi, roiSize, dstBorder, type, -MAX_VALUE, MAX_VALUE);
- anchor.x = -1;
- anchor.y = -1;
+ anchor.x = anchor.y = -1;
UMAT_UPLOAD_INPUT_PARAMETER(src)
UMAT_UPLOAD_OUTPUT_PARAMETER(dst)
@@ -128,11 +126,10 @@ OCL_TEST_P(SepFilter2D, Mat)
}
}
-
OCL_INSTANTIATE_TEST_CASE_P(ImageProc, SepFilter2D,
Combine(
Values(CV_8U, CV_32F),
- Values(1, 4),
+ OCL_ALL_CHANNELS,
Values(
(BorderType)BORDER_CONSTANT,
(BorderType)BORDER_REPLICATE,
From eb8b4c58c7c717a3c2f03c22e186267c4e44f265 Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Thu, 20 Mar 2014 00:28:21 +0400
Subject: [PATCH 042/117] fixed bug in cv::ocl::predictOptimalVectorWidth
---
modules/core/src/arithm.cpp | 21 +++++++++------------
modules/core/src/mathfuncs.cpp | 9 +++------
modules/core/src/ocl.cpp | 7 ++++---
modules/core/test/ocl/test_arithm.cpp | 2 +-
4 files changed, 17 insertions(+), 22 deletions(-)
diff --git a/modules/core/src/arithm.cpp b/modules/core/src/arithm.cpp
index 5672c02ad9..f59eefd32d 100644
--- a/modules/core/src/arithm.cpp
+++ b/modules/core/src/arithm.cpp
@@ -1299,7 +1299,7 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
int type1 = _src1.type(), depth1 = CV_MAT_DEPTH(type1), cn = CV_MAT_CN(type1);
bool haveMask = !_mask.empty();
- if( ((haveMask || haveScalar) && cn > 4) )
+ if ( (haveMask || haveScalar) && cn > 4 )
return false;
int dtype = _dst.type(), ddepth = CV_MAT_DEPTH(dtype), wdepth = std::max(CV_32S, CV_MAT_DEPTH(wtype));
@@ -1320,14 +1320,11 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
"-D convertToWT2=%s -D convertToDT=%s%s -D cn=%d",
(haveMask ? "MASK_" : ""), (haveScalar ? "UNARY_OP" : "BINARY_OP"),
oclop2str[oclop], ocl::typeToStr(CV_MAKETYPE(depth1, kercn)),
- ocl::typeToStr(CV_MAKETYPE(depth1, 1)),
- ocl::typeToStr(CV_MAKETYPE(depth2, kercn)),
- ocl::typeToStr(CV_MAKETYPE(depth2, 1)),
- ocl::typeToStr(CV_MAKETYPE(ddepth, kercn)),
- ocl::typeToStr(CV_MAKETYPE(ddepth, 1)),
- ocl::typeToStr(CV_MAKETYPE(wdepth, kercn)),
+ ocl::typeToStr(depth1), ocl::typeToStr(CV_MAKETYPE(depth2, kercn)),
+ ocl::typeToStr(depth2), ocl::typeToStr(CV_MAKETYPE(ddepth, kercn)),
+ ocl::typeToStr(ddepth), ocl::typeToStr(CV_MAKETYPE(wdepth, kercn)),
ocl::typeToStr(CV_MAKETYPE(wdepth, scalarcn)),
- ocl::typeToStr(CV_MAKETYPE(wdepth, 1)), wdepth,
+ ocl::typeToStr(wdepth), wdepth,
ocl::convertTypeStr(depth1, wdepth, kercn, cvtstr[0]),
ocl::convertTypeStr(depth2, wdepth, kercn, cvtstr[1]),
ocl::convertTypeStr(wdepth, ddepth, kercn, cvtstr[2]),
@@ -1347,7 +1344,7 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
}
ocl::Kernel k("KF", ocl::core::arithm_oclsrc, opts);
- if( k.empty() )
+ if (k.empty())
return false;
UMat src1 = _src1.getUMat(), src2;
@@ -1388,12 +1385,12 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
if( !haveMask )
{
- if(n == 0)
+ if (n == 0)
k.args(src1arg, src2arg, dstarg);
- else if(n == 1)
+ else if (n == 1)
k.args(src1arg, src2arg, dstarg,
ocl::KernelArg(0, 0, 0, 0, usrdata_p, usrdata_esz));
- else if(n == 3)
+ else if (n == 3)
k.args(src1arg, src2arg, dstarg,
ocl::KernelArg(0, 0, 0, 0, usrdata_p, usrdata_esz),
ocl::KernelArg(0, 0, 0, 0, usrdata_p + usrdata_esz, usrdata_esz),
diff --git a/modules/core/src/mathfuncs.cpp b/modules/core/src/mathfuncs.cpp
index 095460c781..16df02cafa 100644
--- a/modules/core/src/mathfuncs.cpp
+++ b/modules/core/src/mathfuncs.cpp
@@ -2041,7 +2041,7 @@ static bool ocl_pow(InputArray _src, double power, OutputArray _dst,
const char * const op = issqrt ? "OP_SQRT" : is_ipower ? "OP_POWN" : "OP_POW";
ocl::Kernel k("KF", ocl::core::arithm_oclsrc,
- format("-D dstT=%s -D %s -D UNARY_OP%s", ocl::typeToStr(CV_MAKE_TYPE(depth, 1)),
+ format("-D dstT=%s -D %s -D UNARY_OP%s", ocl::typeToStr(depth),
op, doubleSupport ? " -D DOUBLE_SUPPORT" : ""));
if (k.empty())
return false;
@@ -2081,7 +2081,7 @@ void pow( InputArray _src, double power, OutputArray _dst )
{
if( ipower < 0 )
{
- divide( 1., _src, _dst );
+ divide( Scalar::all(1), _src, _dst );
if( ipower == -1 )
return;
ipower = -ipower;
@@ -2115,10 +2115,7 @@ void pow( InputArray _src, double power, OutputArray _dst )
Mat src, dst;
if (same)
- {
- dst = _dst.getMat();
- src = dst;
- }
+ src = dst = _dst.getMat();
else
{
src = _src.getMat();
diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp
index 7c4f8de9e0..5a522d4ea8 100644
--- a/modules/core/src/ocl.cpp
+++ b/modules/core/src/ocl.cpp
@@ -4347,7 +4347,7 @@ int predictOptimalVectorWidth(InputArray src1, InputArray src2, InputArray src3,
InputArray src4, InputArray src5, InputArray src6,
InputArray src7, InputArray src8, InputArray src9)
{
- int type = src1.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type);
+ int type = src1.type(), depth = CV_MAT_DEPTH(type), cn = CV_MAT_CN(type), esz = CV_ELEM_SIZE(depth);
Size ssize = src1.size();
const ocl::Device & d = ocl::Device::getDefault();
@@ -4371,7 +4371,8 @@ int predictOptimalVectorWidth(InputArray src1, InputArray src2, InputArray src3,
PROCESS_SRC(src9);
size_t size = offsets.size();
- std::vector dividers(size, width);
+ int wsz = width * esz;
+ std::vector dividers(size, wsz);
for (size_t i = 0; i < size; ++i)
while (offsets[i] % dividers[i] != 0 || steps[i] % dividers[i] != 0 || cols[i] % dividers[i] != 0)
@@ -4379,7 +4380,7 @@ int predictOptimalVectorWidth(InputArray src1, InputArray src2, InputArray src3,
// default strategy
for (size_t i = 0; i < size; ++i)
- if (dividers[i] != width)
+ if (dividers[i] != wsz)
{
width = 1;
break;
diff --git a/modules/core/test/ocl/test_arithm.cpp b/modules/core/test/ocl/test_arithm.cpp
index 8618746c9f..d2b26e1463 100644
--- a/modules/core/test/ocl/test_arithm.cpp
+++ b/modules/core/test/ocl/test_arithm.cpp
@@ -839,7 +839,7 @@ OCL_TEST_P(Pow, Mat)
OCL_OFF(cv::pow(src1_roi, pows[k], dst1_roi));
OCL_ON(cv::pow(usrc1_roi, pows[k], udst1_roi));
- OCL_EXPECT_MATS_NEAR_RELATIVE(dst1, 1e-6);
+ OCL_EXPECT_MATS_NEAR_RELATIVE(dst1, 1e-5);
}
}
From b14c314fc3a18bd204364c7a4c5dec8fe218bdf0 Mon Sep 17 00:00:00 2001
From: Alexander Karsakov
Date: Wed, 19 Mar 2014 17:33:13 +0400
Subject: [PATCH 043/117] Fixed incorrect thread synchronizations
---
modules/objdetect/src/opencl/objdetect_hog.cl | 3 +--
modules/objdetect/test/opencl/test_hogdetector.cpp | 2 +-
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/modules/objdetect/src/opencl/objdetect_hog.cl b/modules/objdetect/src/opencl/objdetect_hog.cl
index 5c71aa1b45..704dec4447 100644
--- a/modules/objdetect/src/opencl/objdetect_hog.cl
+++ b/modules/objdetect/src/opencl/objdetect_hog.cl
@@ -141,9 +141,8 @@ __kernel void compute_hists_lut_kernel(
final_hist[(cell_x * 2 + cell_y) * cnbins + bin_id] =
hist_[0] + hist_[1] + hist_[2];
}
-#ifdef CPU
+
barrier(CLK_LOCAL_MEM_FENCE);
-#endif
int tid = (cell_y * CELLS_PER_BLOCK_Y + cell_x) * 12 + cell_thread_x;
if ((tid < cblock_hist_size) && (gid < blocks_total))
diff --git a/modules/objdetect/test/opencl/test_hogdetector.cpp b/modules/objdetect/test/opencl/test_hogdetector.cpp
index 8568352b69..b3ef6b48fb 100644
--- a/modules/objdetect/test/opencl/test_hogdetector.cpp
+++ b/modules/objdetect/test/opencl/test_hogdetector.cpp
@@ -110,7 +110,7 @@ OCL_TEST_P(HOG, Detect)
OCL_OFF(hog.detectMultiScale(img, cpu_found, 0, Size(8, 8), Size(0, 0), 1.05, 6));
OCL_ON(hog.detectMultiScale(uimg, gpu_found, 0, Size(8, 8), Size(0, 0), 1.05, 6));
- EXPECT_LT(checkRectSimilarity(img.size(), cpu_found, gpu_found), 1.0);
+ EXPECT_LT(checkRectSimilarity(img.size(), cpu_found, gpu_found), 0.05);
}
INSTANTIATE_TEST_CASE_P(OCL_ObjDetect, HOG, testing::Combine(
From 63d8a61b9b18db161e0ff94fc7bac0166f0b8e3b Mon Sep 17 00:00:00 2001
From: Ilya Lavrenov
Date: Wed, 19 Mar 2014 19:12:37 +0400
Subject: [PATCH 044/117] enabled 3-channels support for
cv::createSuperResolution_BTVL1
---
modules/imgproc/src/filter.cpp | 15 ++++++---------
modules/imgproc/test/ocl/test_sepfilter2D.cpp | 4 ++--
modules/superres/src/btv_l1.cpp | 4 +---
3 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/modules/imgproc/src/filter.cpp b/modules/imgproc/src/filter.cpp
index c013a9b16c..2d7c7404f6 100644
--- a/modules/imgproc/src/filter.cpp
+++ b/modules/imgproc/src/filter.cpp
@@ -3425,8 +3425,6 @@ static bool ocl_sepColFilter2D(const UMat & buf, UMat & dst, const Mat & kernelY
return k.run(2, globalsize, localsize, false);
}
-#if 0
-
const int optimizedSepFilterLocalSize = 16;
static bool ocl_sepFilter2D_SinglePass(InputArray _src, OutputArray _dst,
@@ -3484,13 +3482,11 @@ static bool ocl_sepFilter2D_SinglePass(InputArray _src, OutputArray _dst,
return k.run(2, gt2, lt2, false);
}
-#endif
-
static bool ocl_sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
InputArray _kernelX, InputArray _kernelY, Point anchor,
double delta, int borderType )
{
-// Size imgSize = _src.size();
+ Size imgSize = _src.size();
if (abs(delta)> FLT_MIN)
return false;
@@ -3515,10 +3511,11 @@ static bool ocl_sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
if (ddepth < 0)
ddepth = sdepth;
-// CV_OCL_RUN_(kernelY.rows <= 21 && kernelX.rows <= 21 &&
-// imgSize.width > optimizedSepFilterLocalSize + (kernelX.rows >> 1) &&
-// imgSize.height > optimizedSepFilterLocalSize + (kernelY.rows >> 1),
-// ocl_sepFilter2D_SinglePass(_src, _dst, _kernelX, _kernelY, borderType, ddepth), true)
+ CV_OCL_RUN_(kernelY.rows <= 21 && kernelX.rows <= 21 &&
+ imgSize.width > optimizedSepFilterLocalSize + (kernelX.rows >> 1) &&
+ imgSize.height > optimizedSepFilterLocalSize + (kernelY.rows >> 1) &&
+ (borderType & BORDER_ISOLATED) != 0,
+ ocl_sepFilter2D_SinglePass(_src, _dst, _kernelX, _kernelY, borderType, ddepth), true)
UMat src = _src.getUMat();
Size srcWholeSize; Point srcOffset;
diff --git a/modules/imgproc/test/ocl/test_sepfilter2D.cpp b/modules/imgproc/test/ocl/test_sepfilter2D.cpp
index 05d46cc2b3..b724641f45 100644
--- a/modules/imgproc/test/ocl/test_sepfilter2D.cpp
+++ b/modules/imgproc/test/ocl/test_sepfilter2D.cpp
@@ -85,7 +85,7 @@ PARAM_TEST_CASE(SepFilter2D, MatDepth, Channels, BorderType, bool, bool)
temp = randomMat(Size(1, ksize.height), CV_MAKE_TYPE(CV_32F, 1), -MAX_VALUE, MAX_VALUE);
cv::normalize(temp, kernelY, 1.0, 0.0, NORM_L1);
- Size roiSize = randomSize(ksize.width + 16, MAX_VALUE, ksize.height + 20, MAX_VALUE);
+ Size roiSize = randomSize(ksize.width, MAX_VALUE, ksize.height, MAX_VALUE);
int rest = roiSize.width % 4;
if (rest != 0)
roiSize.width += (4 - rest);
@@ -115,7 +115,7 @@ PARAM_TEST_CASE(SepFilter2D, MatDepth, Channels, BorderType, bool, bool)
OCL_TEST_P(SepFilter2D, Mat)
{
- for (int j = 0; j < test_loop_times; j++)
+ for (int j = 0; j < test_loop_times + 1; j++)
{
random_roi();
diff --git a/modules/superres/src/btv_l1.cpp b/modules/superres/src/btv_l1.cpp
index 1e4aa48a7d..d54b4b398a 100644
--- a/modules/superres/src/btv_l1.cpp
+++ b/modules/superres/src/btv_l1.cpp
@@ -1014,10 +1014,8 @@ namespace
return;
#ifdef HAVE_OPENCL
- if (isUmat_ && curFrame_.channels() == 1)
+ if (isUmat_)
curFrame_.copyTo(ucurFrame_);
- else
- isUmat_ = false;
#endif
++storePos_;
From 80a40ae3d7fd2f932addda446f0790e250f29de5 Mon Sep 17 00:00:00 2001
From: mlyashko
Date: Thu, 20 Mar 2014 16:15:43 +0400
Subject: [PATCH 045/117] changed epsilon for test pass on Win32
---
modules/video/test/test_tvl1optflow.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/modules/video/test/test_tvl1optflow.cpp b/modules/video/test/test_tvl1optflow.cpp
index 804eae8b62..274c13e65d 100644
--- a/modules/video/test/test_tvl1optflow.cpp
+++ b/modules/video/test/test_tvl1optflow.cpp
@@ -133,14 +133,13 @@ namespace
}
}
}
-
return sqrt(sum / (1e-9 + counter));
}
}
TEST(Video_calcOpticalFlowDual_TVL1, Regression)
{
- const double MAX_RMSE = 0.02;
+ const double MAX_RMSE = 0.03;
const string frame1_path = TS::ptr()->get_data_path() + "optflow/RubberWhale1.png";
const string frame2_path = TS::ptr()->get_data_path() + "optflow/RubberWhale2.png";
From d060d30fa0ee978a3356f619911fdc078e501d45 Mon Sep 17 00:00:00 2001
From: Andrey Pavlenko
Date: Thu, 20 Mar 2014 21:57:34 +0400
Subject: [PATCH 046/117] enabling OCL LBP branch for all devices
---
modules/objdetect/src/cascadedetect.cpp | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/modules/objdetect/src/cascadedetect.cpp b/modules/objdetect/src/cascadedetect.cpp
index 3f0e6e38ce..2d5c0795dc 100644
--- a/modules/objdetect/src/cascadedetect.cpp
+++ b/modules/objdetect/src/cascadedetect.cpp
@@ -765,11 +765,8 @@ bool LBPEvaluator::read( const FileNode& node, Size _origWinSize )
nchannels = 1;
localSize = lbufSize = Size(0, 0);
if (ocl::haveOpenCL())
- {
- const ocl::Device& device = ocl::Device::getDefault();
- if (device.isAMD() && !device.hostUnifiedMemory())
- localSize = Size(8, 8);
- }
+ localSize = Size(8, 8);
+
return true;
}
From 640e180efe645c32863af549b7a856d91ef0276f Mon Sep 17 00:00:00 2001
From: Andrey Pavlenko
Date: Thu, 20 Mar 2014 22:22:55 +0400
Subject: [PATCH 047/117] switching to CV_HAAR_SCALE_IMAGE mode, enabling test
---
modules/ocl/perf/perf_haar.cpp | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/modules/ocl/perf/perf_haar.cpp b/modules/ocl/perf/perf_haar.cpp
index e70641d061..6b5100b6f2 100644
--- a/modules/ocl/perf/perf_haar.cpp
+++ b/modules/ocl/perf/perf_haar.cpp
@@ -92,12 +92,12 @@ PERF_TEST(HaarFixture, Haar)
typedef std::tr1::tuple Cascade_Image_MinSize_t;
typedef perf::TestBaseWithParam Cascade_Image_MinSize;
-OCL_PERF_TEST_P(Cascade_Image_MinSize, DISABLED_CascadeClassifier,
+OCL_PERF_TEST_P(Cascade_Image_MinSize, CascadeClassifier,
testing::Combine(testing::Values( string("cv/cascadeandhog/cascades/haarcascade_frontalface_alt.xml"),
string("cv/cascadeandhog/cascades/haarcascade_frontalface_alt2.xml") ),
- testing::Values(string("cv/shared/lena.png"),
- string("cv/cascadeandhog/images/bttf301.png")/*,
- string("cv/cascadeandhog/images/class57.png")*/ ),
+ testing::Values( string("cv/shared/lena.png"),
+ string("cv/cascadeandhog/images/bttf301.png"),
+ string("cv/cascadeandhog/images/class57.png") ),
testing::Values(30, 64, 90)))
{
const string cascasePath = get<0>(GetParam());
@@ -121,7 +121,7 @@ OCL_PERF_TEST_P(Cascade_Image_MinSize, DISABLED_CascadeClassifier,
faces.clear();
startTimer();
- cc.detectMultiScale(img, faces, 1.1, 3, 0, minSize);
+ cc.detectMultiScale(img, faces, 1.1, 3, CV_HAAR_SCALE_IMAGE, minSize);
stopTimer();
}
}
@@ -137,7 +137,7 @@ OCL_PERF_TEST_P(Cascade_Image_MinSize, DISABLED_CascadeClassifier,
ocl::finish();
startTimer();
- cc.detectMultiScale(uimg, faces, 1.1, 3, 0, minSize);
+ cc.detectMultiScale(uimg, faces, 1.1, 3, CV_HAAR_SCALE_IMAGE, minSize);
stopTimer();
}
}
From b7198ccf1c6f076586b74218a59727a968d55b26 Mon Sep 17 00:00:00 2001
From: Andrey Pavlenko
Date: Thu, 20 Mar 2014 22:30:16 +0400
Subject: [PATCH 048/117] dropping legacy modes testing
---
modules/objdetect/perf/opencl/perf_cascades.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/modules/objdetect/perf/opencl/perf_cascades.cpp b/modules/objdetect/perf/opencl/perf_cascades.cpp
index b660f59111..dd61cdb668 100644
--- a/modules/objdetect/perf/opencl/perf_cascades.cpp
+++ b/modules/objdetect/perf/opencl/perf_cascades.cpp
@@ -18,8 +18,6 @@ OCL_PERF_TEST_P(Cascade_Image_MinSize, CascadeClassifier,
testing::Combine(
testing::Values( string("cv/cascadeandhog/cascades/haarcascade_frontalface_alt.xml"),
string("cv/cascadeandhog/cascades/haarcascade_frontalface_alt2.xml"),
- string("cv/cascadeandhog/cascades/haarcascade_frontalface_alt_old.xml"),
- string("cv/cascadeandhog/cascades/haarcascade_frontalface_alt2_old.xml"),
string("cv/cascadeandhog/cascades/lbpcascade_frontalface.xml") ),
testing::Values( string("cv/shared/lena.png"),
string("cv/cascadeandhog/images/bttf301.png"),
From 0bd4fd3a87ddee808419e1e4d656c2cbe7dc94ca Mon Sep 17 00:00:00 2001
From: Alexander Karsakov
Date: Mon, 17 Mar 2014 12:18:55 +0400
Subject: [PATCH 049/117] Workaround for Intel platform: replace min() with
ternary operator
---
modules/imgproc/src/opencl/morph.cl | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/modules/imgproc/src/opencl/morph.cl b/modules/imgproc/src/opencl/morph.cl
index cb6e733ed4..35c0a27ff6 100644
--- a/modules/imgproc/src/opencl/morph.cl
+++ b/modules/imgproc/src/opencl/morph.cl
@@ -69,8 +69,13 @@
#endif
#ifdef ERODE
+#ifdef INTEL_DEVICE
+// workaround for bug in Intel HD graphics drivers (10.18.10.3496 or older)
+#define MORPH_OP(A,B) ((A) < (B) ? (A) : (B))
+#else
#define MORPH_OP(A,B) min((A),(B))
#endif
+#endif
#ifdef DILATE
#define MORPH_OP(A,B) max((A),(B))
#endif
From b0ad84cfa2f4ecb884de542c9706177f22dade6d Mon Sep 17 00:00:00 2001
From: Alexander Smorkalov
Date: Fri, 21 Mar 2014 12:48:38 +0400
Subject: [PATCH 050/117] Libraries filter update after abs path cut.
---
cmake/OpenCVGenAndroidMK.cmake | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/cmake/OpenCVGenAndroidMK.cmake b/cmake/OpenCVGenAndroidMK.cmake
index ee52fa6886..2622d2aaed 100644
--- a/cmake/OpenCVGenAndroidMK.cmake
+++ b/cmake/OpenCVGenAndroidMK.cmake
@@ -56,8 +56,11 @@ if(ANDROID)
# remove CUDA runtime and NPP from regular deps
# it can be added separately if needed.
- ocv_list_filterout(OPENCV_EXTRA_COMPONENTS_CONFIGMAKE "libcu")
- ocv_list_filterout(OPENCV_EXTRA_COMPONENTS_CONFIGMAKE "libnpp")
+ ocv_list_filterout(OPENCV_EXTRA_COMPONENTS_CONFIGMAKE "cusparse")
+ ocv_list_filterout(OPENCV_EXTRA_COMPONENTS_CONFIGMAKE "cufft")
+ ocv_list_filterout(OPENCV_EXTRA_COMPONENTS_CONFIGMAKE "cublas")
+ ocv_list_filterout(OPENCV_EXTRA_COMPONENTS_CONFIGMAKE "npp")
+ ocv_list_filterout(OPENCV_EXTRA_COMPONENTS_CONFIGMAKE "cudart")
if(HAVE_CUDA)
# CUDA runtime libraries and are required always
From 846266fde4c82fe392ccf122ef64ea30b6da4f01 Mon Sep 17 00:00:00 2001
From: Alexander Smorkalov
Date: Wed, 19 Feb 2014 16:20:40 +0400
Subject: [PATCH 051/117] Native camera fix for some deivices with Qualcomm SoC
like Samsung Galaxy S4.
---
.../armeabi-v7a/libnative_camera_r2.2.0.so | Bin 275932 -> 271836 bytes
.../armeabi-v7a/libnative_camera_r2.3.3.so | Bin 275932 -> 271836 bytes
.../armeabi-v7a/libnative_camera_r3.0.1.so | Bin 275932 -> 271836 bytes
.../armeabi-v7a/libnative_camera_r4.0.0.so | Bin 263644 -> 259548 bytes
.../armeabi-v7a/libnative_camera_r4.0.3.so | Bin 275932 -> 271836 bytes
.../armeabi-v7a/libnative_camera_r4.1.1.so | Bin 275932 -> 271836 bytes
.../armeabi-v7a/libnative_camera_r4.2.0.so | Bin 275932 -> 271836 bytes
.../armeabi-v7a/libnative_camera_r4.3.0.so | Bin 275932 -> 271836 bytes
.../armeabi-v7a/libnative_camera_r4.4.0.so | Bin 275932 -> 271836 bytes
.../lib/armeabi/libnative_camera_r2.2.0.so | Bin 288212 -> 284116 bytes
.../lib/armeabi/libnative_camera_r2.3.3.so | Bin 288212 -> 284116 bytes
.../lib/armeabi/libnative_camera_r3.0.1.so | Bin 284124 -> 280028 bytes
.../lib/armeabi/libnative_camera_r4.0.0.so | Bin 271832 -> 267736 bytes
.../lib/armeabi/libnative_camera_r4.0.3.so | Bin 284120 -> 280024 bytes
.../lib/armeabi/libnative_camera_r4.1.1.so | Bin 288216 -> 284120 bytes
.../lib/armeabi/libnative_camera_r4.2.0.so | Bin 288216 -> 284120 bytes
.../lib/armeabi/libnative_camera_r4.3.0.so | Bin 288220 -> 284124 bytes
.../lib/armeabi/libnative_camera_r4.4.0.so | Bin 284124 -> 280028 bytes
3rdparty/lib/mips/libnative_camera_r4.0.3.so | Bin 546012 -> 545972 bytes
3rdparty/lib/mips/libnative_camera_r4.1.1.so | Bin 546104 -> 546008 bytes
3rdparty/lib/mips/libnative_camera_r4.2.0.so | Bin 546108 -> 546012 bytes
3rdparty/lib/mips/libnative_camera_r4.3.0.so | Bin 546104 -> 546008 bytes
3rdparty/lib/mips/libnative_camera_r4.4.0.so | Bin 550340 -> 550308 bytes
3rdparty/lib/x86/libnative_camera_r2.3.3.so | Bin 427444 -> 423348 bytes
3rdparty/lib/x86/libnative_camera_r3.0.1.so | Bin 427444 -> 423348 bytes
3rdparty/lib/x86/libnative_camera_r4.0.3.so | Bin 427444 -> 423348 bytes
3rdparty/lib/x86/libnative_camera_r4.1.1.so | Bin 431540 -> 427444 bytes
3rdparty/lib/x86/libnative_camera_r4.2.0.so | Bin 447940 -> 443844 bytes
3rdparty/lib/x86/libnative_camera_r4.3.0.so | Bin 447940 -> 443844 bytes
3rdparty/lib/x86/libnative_camera_r4.4.0.so | Bin 456132 -> 456132 bytes
.../camera_wrapper/CMakeLists.txt | 2 +-
.../camera_wrapper/camera_wrapper.cpp | 173 ++++++++++--------
.../src/java/android+NativeCameraView.java | 1 -
33 files changed, 102 insertions(+), 74 deletions(-)
diff --git a/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so b/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so
index 5b618a87459123ff5f70d6f0647ca5d1785140cb..9b8352e03fe48531bab41f5b28dccdc403c7898d 100755
GIT binary patch
delta 80209
zcmZ_14}6XF|NnnoXB)$4V;F{EY8WQes;SW&^RFn?NK8>v)RbyOXNuk`)kGZ?#XI#@
zsYVnL1?00`&=XrKsozM4o-EOZvp7-bT`Fg#sKdnu>YtecCvaLi^n)w2qFndvj-Oe>FV^I@VJJ$;t
zi+Z?v+G&f%x!QRSJYrkrntGEghECG_tT28YKBRLfUB3)JGsAY~RJz&(e+Cbru5c;5
z^I_Y%RN0PTrA@W15wO&+A7Oc{gP*yal_C|ok?`4d5msxha25Q_s0eG8@*sHo)wXp;
zc{CiHWQHfghsQe`%b9_P;EmVVRthoc@YS&VHzGV#AR(6onSpP^5-P(uPBx)V(qSLC
zf2M7%#+DAIhQ*(RPZ7`8_;&cV{0QoIDD5lBR0^!u;*qR2~?2bA{8D9OIRPqN8mo>Cux3ceGHwX!C_(iC_IXM
zb`q!kxBeOTSik<$VKrkQ@4VJ_D#$9j1U>-EiW0sOJ_ySgkySn>jAz1C#AVPq+Z+x~
zvPM6HyJQ9Hd!nu1{^5wWnl-SjYwHrCt-fJ=3w-#q(4c)3o=yHH8kY`VfP<5C_z|4e
zJhTIU0}mXiJFtfezu=gFLpFgl(6pgt-Snt!6~MB@ec{=}gG+ojJm;a%pj`lWcH0(5
z7^nWyFkTJ!Bfdl9-@(DjBXfA%a0oYOWLbMSgh+!j13lprupFj@Z-N_4V3V+?3Eu-R
zVH?XPk}>o&eCi3?86y&33a{WeAY(vyJ$y&D&CIg@%M$x>1Sgq+8h9QF>DUr)6JuGM
zVcC?z1L5E#`NP9_6nuCvGpM`SLt*jNbQ4YIy)W8<_k7+wMQ&<<~d
z7aL;>KZZy28qV_UYRPSRfAFrE$v`*&vG-(d;c
z4QB0HcJp9!fkAss7|#ylEn)0x@z46{EkgY}d%^uAtQccke)43KyaK;;YiKW63onDE
z9f@xjLnm3nUGT`^fpfORe}wamL3shLy3MvS$(1pa)sp4Ef{Q6R0E%NuOUt^&;KlG2
z9D0NC4T(&V~`bf;3P9V#}npwJB$y6vDM15irA0Y
zS)2w_;UrEjLC%DOlWem5Fn%qJJ-fpk&RIrVkOq3mSw|<~31Pf2j6VxS5O32oRHmkpb?j)
z923U3!wqhVu<|(nIIHMB90PL#t3=kwqj3M*BAkM7DQKWy@+7#;w9QHH8rcHL?I3!}7m?7v07Emn^*`{EFkryCR%Jsqi^?p0NoUCUIyb
z-c|G4!o{6Jht^K;nrU|3?Q<5q5ti!S5t+%kA))WmuOK01x_zZ?%FVKI)%7NLZ<
zVf+42d^?RJ9XNU#^}EB-M*S>!xW{N
zI(aN>s?os9VHMWGbBy>-*j!^i_yr?g1Dk`cb+To>MLc+JxDswVJ#bkrV{VKG$2=Sb
zR$vg$geN>0y6j#CXS2%W{v?i_=>zyPBfb}2!V(4JW$*%nYv3IQH|@-wk#QC5Nyp)1
z)CU_F3HRq-EmvpgL3o7GzydgDSA=s37H2iG-h`8k8QcnI6PF7TiSLES8uiQIXyUTh
z5cgOYa4g0l$8o99>|)C*G%BRPiNxhvQsVvLRYv~Ja36#3f%DyVcW#HE?6@?SiM%J@EEfp}n9SE--eZdMRvE;=uz^2iVNdfd4Y;
zkAdU3wL=2u|NF77P>0On3OI)j0;{lzwFZ8Jc(8+Q@B}zZXZQ#B;FEUUvA!HOJ8am6
z-PRZ*$?$IO1?S8ChqD{txQRn?a4(o93Gf;1U@`nzVJQ9%9J@O-2)Dzja9|KOvi8A6
zbQn#2*=vr%Im9C!Ze*Q>{fvP~`gaCJW6mlCMnVU8gu$1?6Ac~;S2_&@>W_mnjrfCb
zq`^)87LIdG9<~a`*o%*xkmskT_MmYQ-T*Nbe=}!jzmua&9F~>=cqlxuB
z2}}PMN;n4lSY^TZ-|zxskTvba=~oXla(~|$o<;m3+Ur0E>99G&cfdLHC+7;;1T#E1
z@^Qqf<2m>Ma~#~}Z^Gs_+zgwKR=CK@X-k|MuhK=?;
zmK#TKYKk!eZp_K#TWpzuNpSb4Y-^(O)9^z0j4Kd-9X`C-w&rU5Q+Pc~n529PUT!R)
zs}GyFj=BGBiDN;Xqp8&uUS;qQc%{L2!K)3P3l|x@0xmH4Q+Teyd*N9@mh<0lIHm_3
zu+`VH<{R7sp7#t-!|lKlcY(XJ#Orhkv*0Ip+tw;wBlF>%-`Lhx&Hol|uoKpJ++`ft
zzOt>Q#GU*9TX2lt#*r%`(7~(lK2{-nma_?t!uI>2tJoU&z_WacrSY`O+2%!oPr+o9
z-3A~1%2jtG20c$2{&z*`O83GX$y6du8DEf*kiT=)}S
zMZB5AjjV=O=pgp!HtC4N+{S%ja|wsT{oe>&V#yPZyWri%^ML}m*Wa$XBk9Xw9fqYnPZJ!{;CUQ-NML@PgpNFk*k|nL*TDTb&;$?FFTleMJ_(ODxc^m_
zHOXKvJk8*f@a)w*e+f2tO$MXbNLU2FVDNExg~1v97!w9Bgf|*|4Bl?=RabLa|DJ8#
ztP6ZAY`@R>Ke$RBz+oeF(&@-a<;07#V
z@Ot29c(cJx2Jk4C15t2{T>?-0$mM*l=p3j9c-ZD2h8&AXcxyw5cfySgu7z(i8cevB
zBOM1OInYRhm%<~B_z?K85x)bDZW~(TvpqO=v=2GF@WM+Yti5)i!Ow&*kFb7JJ_!#r
zI*>&_Xmrp5zQTz2fDah)LGbc+p-t+!9mfvCF&m!xfy?5i*IA-h;pXdIb)Vbqgu5FZ
z9D?^59sCXF(_R|&Wy~}g$TcC%mUZ}IIE@9?G2^j@;^_BRXdB%FAK>IZQD@)Eh5Bxy?