void for_each_pixel(cv::Mat & m, std::function<void(cv::Mat &, int, int)> f) {
for (int y = 0; y < m.rows; y++) {
for (int x = 0; x < m.cols; x++) {
f(m, y, x);
}
}
}
Erstes Ziel der Optimierung sollte immer der Algorithmus sein.
for_each_pixel(img, [](cv::Mat & m, int y, int x) {
if (bba::isColor(m)) {
m.at<cv::Vec3b>(y,x) += cv::Vec3b(1,1,1);
} else {
m.at<unsigned char>(y,x) += 1;
}
});
if (bba::isColor(m)) {
for_each_pixel(img, [](cv::Mat & m, int y, int x) {
m.at<cv::Vec3b>(y,x) += cv::Vec3b(1,1,1);
});
} else {
for_each_pixel(img, [](cv::Mat & m, int y, int x) {
m.at<unsigned char>(y,x) += 1;
});
}
Der Aufruf von f wird meistens nicht durch inlining eliminiert, da f in der Regel zur Übersetzungszeit nicht feststeht.
void for_each_pixel(cv::Mat & m, std::function<void(cv::Mat &, int, int)> f) {
for (int y = 0; y < m.rows; y++) {
for (int x = 0; x < m.cols; x++) {
f(m, y, x);
}
}
}
Eine Lösung: Nicht f einbetten, sondern die Schleifen mit Vorlagen darum herum bauen.
template <typename F> void for_each_pixel(cv::Mat & m, F f) {
for (int y = 0; y < m.rows; y++) {
for (int x = 0; x < m.cols; x++) {
f(m, y, x);
}
}
}
Der Code
// Vorlage
template <typename F> void for_each_pixel(cv::Mat & m, F f) {
for (int y = 0; y < m.rows; y++) {
for (int x = 0; x < m.cols; x++) {
f(m, y, x);
}
}
}
// konkreter Aufruf
for_each_pixel(img, [](cv::Mat & m, int y, int x) {
m.at<unsigned char>(y,x) = m.at<unsigned char>(y,x);
});
kann vom Compiler transparent zusammengesetzt werden zu
for (int y = 0; y < m.rows; y++) {
for (int x = 0; x < m.cols; x++) {
m.at<unsigned char>(y,x) = m.at<unsigned char>(y,x);
}
}
. Der Unterprogrammsprung ist erfolgreich vermieden worden.
Experten können sich ein vereinfachtes Beispiel hier ansehen.
Bei Fehlern sind die meldungen des Compilers etwas unübersichtlich. Hier wurde versehentlich ein cv::Vec3b anstelle eines unsigned int verwendet.
template.cpp: In lambda function:
template.cpp:15:30: error: no match for ‘operator+=’ (operand types are ‘unsigned char’ and ‘cv::Vec3b’ {aka ‘cv::Vec<unsigned char, 3>’})
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
In file included from opencv2/core.hpp:57,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/matx.hpp:1185:19: note: candidate: ‘template<class _Tp1, class _Tp2, int m, int n> cv::Matx<_Tp, m, n>& cv::operator+=(cv::Matx<_Tp, m, n>&, const cv::Matx<_Tp2, m, n>&)’
1185 | Matx<_Tp1, m, n>& operator += (Matx<_Tp1, m, n>& a, const Matx<_Tp2, m, n>& b)
| ^~~~~~~~
opencv2/core/matx.hpp:1185:19: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Matx<_Tp, m, n>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:57,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/matx.hpp:1313:16: note: candidate: ‘template<class _Tp1, class _Tp2, int cn> cv::Vec<_Tp, n>& cv::operator+=(cv::Vec<_Tp, n>&, const cv::Vec<_Tp2, cn>&)’
1313 | Vec<_Tp1, cn>& operator += (Vec<_Tp1, cn>& a, const Vec<_Tp2, cn>& b)
| ^~~~~~~~
opencv2/core/matx.hpp:1313:16: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Vec<_Tp, n>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:58,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/types.hpp:1031:15: note: candidate: ‘template<class _Tp> cv::Complex<_Tp>& cv::operator+=(cv::Complex<_Tp>&, const cv::Complex<_Tp>&)’
1031 | Complex<_Tp>& operator += (Complex<_Tp>& a, const Complex<_Tp>& b)
| ^~~~~~~~
opencv2/core/types.hpp:1031:15: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Complex<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:58,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/types.hpp:1097:15: note: candidate: ‘template<class _Tp> cv::Complex<_Tp>& cv::operator+=(cv::Complex<_Tp>&, _Tp)’
1097 | Complex<_Tp>& operator += (Complex<_Tp>& a, _Tp b)
| ^~~~~~~~
opencv2/core/types.hpp:1097:15: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Complex<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:58,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/types.hpp:1235:14: note: candidate: ‘template<class _Tp> cv::Point_<_Tp>& cv::operator+=(cv::Point_<_Tp>&, const cv::Point_<_Tp>&)’
1235 | Point_<_Tp>& operator += (Point_<_Tp>& a, const Point_<_Tp>& b)
| ^~~~~~~~
opencv2/core/types.hpp:1235:14: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Point_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:58,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/types.hpp:1496:15: note: candidate: ‘template<class _Tp> cv::Point3_<_Tp>& cv::operator+=(cv::Point3_<_Tp>&, const cv::Point3_<_Tp>&)’
1496 | Point3_<_Tp>& operator += (Point3_<_Tp>& a, const Point3_<_Tp>& b)
| ^~~~~~~~
opencv2/core/types.hpp:1496:15: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Point3_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:58,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/types.hpp:1775:13: note: candidate: ‘template<class _Tp> cv::Size_<_Tp>& cv::operator+=(cv::Size_<_Tp>&, const cv::Size_<_Tp>&)’
1775 | Size_<_Tp>& operator += (Size_<_Tp>& a, const Size_<_Tp>& b)
| ^~~~~~~~
opencv2/core/types.hpp:1775:13: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Size_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:58,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/types.hpp:1918:13: note: candidate: ‘template<class _Tp> cv::Rect_<_Tp>& cv::operator+=(cv::Rect_<_Tp>&, const cv::Point_<_Tp>&)’
1918 | Rect_<_Tp>& operator += ( Rect_<_Tp>& a, const Point_<_Tp>& b )
| ^~~~~~~~
opencv2/core/types.hpp:1918:13: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Rect_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:58,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/types.hpp:1934:13: note: candidate: ‘template<class _Tp> cv::Rect_<_Tp>& cv::operator+=(cv::Rect_<_Tp>&, const cv::Size_<_Tp>&)’
1934 | Rect_<_Tp>& operator += ( Rect_<_Tp>& a, const Size_<_Tp>& b )
| ^~~~~~~~
opencv2/core/types.hpp:1934:13: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Rect_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:58,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/types.hpp:2256:15: note: candidate: ‘template<class _Tp> cv::Scalar_<_Tp>& cv::operator+=(cv::Scalar_<_Tp>&, const cv::Scalar_<_Tp>&)’
2256 | Scalar_<_Tp>& operator += (Scalar_<_Tp>& a, const Scalar_<_Tp>& b)
| ^~~~~~~~
opencv2/core/types.hpp:2256:15: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Scalar_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core/mat.hpp:3724,
from opencv2/core.hpp:59,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/mat.inl.hpp:3483:6: note: candidate: ‘cv::Mat& cv::operator+=(cv::Mat&, const cv::MatExpr&)’
3483 | Mat& operator += (Mat& a, const MatExpr& b)
| ^~~~~~~~
opencv2/core/mat.inl.hpp:3483:24: note: no known conversion for argument 1 from ‘unsigned char’ to ‘cv::Mat&’
3483 | Mat& operator += (Mat& a, const MatExpr& b)
| ~~~~~^
opencv2/core/mat.inl.hpp:3490:12: note: candidate: ‘const cv::Mat& cv::operator+=(const cv::Mat&, const cv::MatExpr&)’
3490 | const Mat& operator += (const Mat& a, const MatExpr& b)
| ^~~~~~~~
opencv2/core/mat.inl.hpp:3490:36: note: no known conversion for argument 1 from ‘unsigned char’ to ‘const cv::Mat&’
3490 | const Mat& operator += (const Mat& a, const MatExpr& b)
| ~~~~~~~~~~~^
opencv2/core/mat.inl.hpp:3497:12: note: candidate: ‘template<class _Tp> cv::Mat_<_Tp>& cv::operator+=(cv::Mat_<_Tp>&, const cv::MatExpr&)’
3497 | Mat_<_Tp>& operator += (Mat_<_Tp>& a, const MatExpr& b)
| ^~~~~~~~
opencv2/core/mat.inl.hpp:3497:12: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core/mat.hpp:3724,
from opencv2/core.hpp:59,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/mat.inl.hpp:3504:18: note: candidate: ‘template<class _Tp> const cv::Mat_<_Tp>& cv::operator+=(const cv::Mat_<_Tp>&, const cv::MatExpr&)’
3504 | const Mat_<_Tp>& operator += (const Mat_<_Tp>& a, const MatExpr& b)
| ^~~~~~~~
opencv2/core/mat.inl.hpp:3504:18: note: template argument deduction/substitution failed:
template.cpp:15:48: note: mismatched types ‘const cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:255:22: note: candidate: ‘cv::Mat& cv::operator+=(cv::Mat&, const cv::Mat&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:258:5: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
258 | CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:269:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR’
269 | CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Mat)
| ^~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:38: note: no known conversion for argument 1 from ‘unsigned char’ to ‘cv::Mat&’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^
opencv2/core/operations.hpp:258:5: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
258 | CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:269:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR’
269 | CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Mat)
| ^~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: candidate: ‘const cv::Mat& cv::operator+=(const cv::Mat&, const cv::Mat&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:259:5: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
259 | CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:269:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR’
269 | CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Mat)
| ^~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:38: note: no known conversion for argument 1 from ‘unsigned char’ to ‘const cv::Mat&’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^
opencv2/core/operations.hpp:259:5: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
259 | CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:269:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR’
269 | CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Mat)
| ^~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: candidate: ‘cv::Mat& cv::operator+=(cv::Mat&, const Scalar&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:258:5: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
258 | CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:270:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR’
270 | CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Scalar)
| ^~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:38: note: no known conversion for argument 1 from ‘unsigned char’ to ‘cv::Mat&’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^
opencv2/core/operations.hpp:258:5: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
258 | CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:270:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR’
270 | CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Scalar)
| ^~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: candidate: ‘const cv::Mat& cv::operator+=(const cv::Mat&, const Scalar&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:259:5: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
259 | CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:270:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR’
270 | CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Scalar)
| ^~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:38: note: no known conversion for argument 1 from ‘unsigned char’ to ‘const cv::Mat&’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^
opencv2/core/operations.hpp:259:5: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
259 | CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:270:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR’
270 | CV_MAT_AUG_OPERATOR (+=, cv::add(a,b,a), Mat, Scalar)
| ^~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: candidate: ‘template<class _Tp> cv::Mat_<_Tp>& cv::operator+=(cv::Mat_<_Tp>&, const cv::Mat&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:262:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
262 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:271:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
271 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat)
| ^~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: template argument deduction/substitution failed:
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:262:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
262 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:271:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
271 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat)
| ^~~~~~~~~~~~~~~~~~~~~
template.cpp:15:48: note: mismatched types ‘cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:255:22: note: candidate: ‘template<class _Tp> const cv::Mat_<_Tp>& cv::operator+=(const cv::Mat_<_Tp>&, const cv::Mat&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:263:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
263 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:271:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
271 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat)
| ^~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: template argument deduction/substitution failed:
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:263:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
263 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:271:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
271 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat)
| ^~~~~~~~~~~~~~~~~~~~~
template.cpp:15:48: note: mismatched types ‘const cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:255:22: note: candidate: ‘template<class _Tp> cv::Mat_<_Tp>& cv::operator+=(cv::Mat_<_Tp>&, const Scalar&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:262:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
262 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:272:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
272 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Scalar)
| ^~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: template argument deduction/substitution failed:
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:262:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
262 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:272:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
272 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Scalar)
| ^~~~~~~~~~~~~~~~~~~~~
template.cpp:15:48: note: mismatched types ‘cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:255:22: note: candidate: ‘template<class _Tp> const cv::Mat_<_Tp>& cv::operator+=(const cv::Mat_<_Tp>&, const Scalar&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:263:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
263 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:272:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
272 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Scalar)
| ^~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: template argument deduction/substitution failed:
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:263:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
263 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:272:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
272 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Scalar)
| ^~~~~~~~~~~~~~~~~~~~~
template.cpp:15:48: note: mismatched types ‘const cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:255:22: note: candidate: ‘template<class _Tp> cv::Mat_<_Tp>& cv::operator+=(cv::Mat_<_Tp>&, const cv::Mat_<_Tp>&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:262:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
262 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:273:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
273 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
| ^~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: template argument deduction/substitution failed:
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:262:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
262 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, A, B) \
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:273:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
273 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
| ^~~~~~~~~~~~~~~~~~~~~
template.cpp:15:48: note: mismatched types ‘cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:255:22: note: candidate: ‘template<class _Tp> const cv::Mat_<_Tp>& cv::operator+=(const cv::Mat_<_Tp>&, const cv::Mat_<_Tp>&)’
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:263:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
263 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:273:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
273 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
| ^~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:255:22: note: template argument deduction/substitution failed:
255 | static inline A& operator op (A& a, const B& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:263:28: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR1’
263 | template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, cvop, const A, B)
| ^~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:273:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_T’
273 | CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
| ^~~~~~~~~~~~~~~~~~~~~
template.cpp:15:48: note: mismatched types ‘const cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:266:59: note: candidate: ‘template<class _Tp, int m, int n> cv::Mat& cv::operator+=(cv::Mat&, const cv::Matx<_Tp, m, n>&)’
266 | template<typename _Tp, int m, int n> static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \
| ^~~~~~~~
opencv2/core/operations.hpp:274:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_TN’
274 | CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat)
| ^~~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:266:59: note: template argument deduction/substitution failed:
266 | template<typename _Tp, int m, int n> static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \
| ^~~~~~~~
opencv2/core/operations.hpp:274:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_TN’
274 | CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat)
| ^~~~~~~~~~~~~~~~~~~~~~
template.cpp:15:24: note: cannot convert ‘(& m)->cv::Mat::at<unsigned char>(y, x)’ (type ‘unsigned char’) to type ‘cv::Mat&’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ~~~~~~~~~~~~~~~~~~~^~~~~
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:267:65: note: candidate: ‘template<class _Tp, int m, int n> const cv::Mat& cv::operator+=(const cv::Mat&, const cv::Matx<_Tp, m, n>&)’
267 | template<typename _Tp, int m, int n> static inline const A& operator op (const A& a, const Matx<_Tp,m,n>& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:274:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_TN’
274 | CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat)
| ^~~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:267:65: note: template argument deduction/substitution failed:
267 | template<typename _Tp, int m, int n> static inline const A& operator op (const A& a, const Matx<_Tp,m,n>& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:274:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_TN’
274 | CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat)
| ^~~~~~~~~~~~~~~~~~~~~~
template.cpp:15:24: note: cannot convert ‘(& m)->cv::Mat::at<unsigned char>(y, x)’ (type ‘unsigned char’) to type ‘const cv::Mat&’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ~~~~~~~~~~~~~~~~~~~^~~~~
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:266:59: note: candidate: ‘template<class _Tp, int m, int n> cv::Mat_<_Tp>& cv::operator+=(cv::Mat_<_Tp>&, const cv::Matx<_Tp, m, n>&)’
266 | template<typename _Tp, int m, int n> static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \
| ^~~~~~~~
opencv2/core/operations.hpp:275:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_TN’
275 | CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat_<_Tp>)
| ^~~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:266:59: note: template argument deduction/substitution failed:
266 | template<typename _Tp, int m, int n> static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \
| ^~~~~~~~
opencv2/core/operations.hpp:275:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_TN’
275 | CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat_<_Tp>)
| ^~~~~~~~~~~~~~~~~~~~~~
template.cpp:15:48: note: mismatched types ‘cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
In file included from opencv2/core.hpp:3291,
from opencv2/opencv.hpp:52,
from template.cpp:1:
opencv2/core/operations.hpp:267:65: note: candidate: ‘template<class _Tp, int m, int n> const cv::Mat_<_Tp>& cv::operator+=(const cv::Mat_<_Tp>&, const cv::Matx<_Tp, m, n>&)’
267 | template<typename _Tp, int m, int n> static inline const A& operator op (const A& a, const Matx<_Tp,m,n>& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:275:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_TN’
275 | CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat_<_Tp>)
| ^~~~~~~~~~~~~~~~~~~~~~
opencv2/core/operations.hpp:267:65: note: template argument deduction/substitution failed:
267 | template<typename _Tp, int m, int n> static inline const A& operator op (const A& a, const Matx<_Tp,m,n>& b) { cvop; return a; }
| ^~~~~~~~
opencv2/core/operations.hpp:275:1: note: in expansion of macro ‘CV_MAT_AUG_OPERATOR_TN’
275 | CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat_<_Tp>)
| ^~~~~~~~~~~~~~~~~~~~~~
template.cpp:15:48: note: mismatched types ‘const cv::Mat_<_Tp>’ and ‘unsigned char’
15 | m.at<unsigned char>(y,x) += cv::Vec3b(1,1,1);
| ^
Im Jahre 2020:

Beispiel: Bedarfsauswertung
./bba --input lena.pgm --brightness 0.5 --drop
Erstes Ziel der Optimierung sollte immer der Algorithmus sein.