【发布时间】:2017-02-15 04:52:11
【问题描述】:
我在 Ubuntu 16.04 上使用来自 trunk 和 gcc 5.4 的最新 OpenCV。
我很难理解为什么下面的代码无法编译
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;
}
【问题讨论】: