我使用的是来自trunk和gcc 5.4的最新OpenCV,在Ubuntu 16.04上。
我很难理解为什么下面的代码无法编译
template <typename T>
void Func2(const cv::Scalar clr, cv::Mat &img){
img.at<T>(0, 0) = clr;
}
void Func1(const bool flag, const cv::Scalar clr, cv::Mat &img){
if (flag == 1){
Func2<cv::Vec4b>(clr, img);
}
else{
Func2<cv::Vec3b>(clr, img);
}
}
int main(){
cv::Mat img = cv::Mat(100, 100, CV_8UC4, cv::Scalar(1,1,1,1));
cv::Scalar clr = cv::Scalar(0, 0, 0, 0);
Func1(1, clr, img);
return 0;
}
编译错误是
实例化
void Func2(cv::Scalar, cv::Mat&) [with T = cv::Vec<unsigned char, 3>; cv::Scalar = cv::Scalar_<double>]
:从此处要求错误:
operator=
不匹配(操作数类型为cv::Vec<unsigned char, 3>
和const Scalar {aka const cv::Scalar_<double>}
)
img.at<T>(0, 0) = clr; ^
/usr/local/include/opencv2/core/matx.hpp:305:38:注意:候选人:
constexpr cv::Vec<unsigned char, 3>& cv::Vec<unsigned char, 3>::operator=(const cv::Vec<unsigned char, 3>&) template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1> ^
/usr/local/include/opencv2/core/matx.hpp:305:38:注意:不知道 将参数1从const Scalar {aka const cv::Scalar_<double>}
转换为const cv::Vec<unsigned char, 3>&
我当时认为cv::Scalar
的类型可能需要正确匹配,但即使是下面的代码编译也没有问题
int main(){
cv::Mat img = cv::Mat(100, 100, CV_8UC4, cv::Scalar(1,1,1,1));
cv::Scalar clr = cv::Scalar(0, 0, 0);
img.at<cv::Vec4b>(0, 0) = clr // still compiles but has runtime error
return 0;
}