我正在尝试编写代码以将opencv
图片转换为QImage
。我想使用模板将其实现为通用函数。这就是我所拥有的:
#include <QImage>
#include <opencv2/core/core.hpp>
void setPixel(int j, int i, unsigned char v, QImage & img)
{
img.setPixel(j, i, qRgb(v, v, v));
}
void setPixel(int j, int i, cv::Vec3b v, QImage & img)
{
img.setPixel(j, i, qRgb(v[2], v[1], v[0]));
}
template <typename ImageType>
QImage toQImageARGB (const cv::Mat & image)
{
QImage res(image.cols, image.rows, QImage::Format_ARGB32_Premultiplied);
ImageType tmp;
for (int i = 0; i < image.rows; ++i)
{
for (int j = 0; j < image.cols; ++j)
{
tmp = image.at<ImageType>(i,j);
setPixel(j, i, tmp, res);
}
}
return res;
}
我收到以下编译时错误
CMakeFiles/annotate.dir/main.cpp.o: In function `std::remove_reference<cv::ximgproc::SuperpixelSEEDS*&>::type&& std::move<cv::ximgproc::SuperpixelSEEDS*&>(cv::ximgproc::SuperpixelSEEDS*&)':
.../util.h:8: multiple definition of `setPixel(int, int, unsigned char, QImage&)'
CMakeFiles/annotate.dir/moc_widget.cxx.o:.../build/../util.h:8: first defined here
CMakeFiles/annotate.dir/main.cpp.o: In function `cv::Vec<unsigned char, 3> const& cv::Mat::at<cv::Vec<unsigned char, 3> >(int, int) const':
.../util.h:13: multiple definition of `setPixel(int, int, cv::Vec<unsigned char, 3>, QImage&)'
CMakeFiles/annotate.dir/moc_widget.cxx.o:.../build/../util.h:13: first defined here
collect2: error: ld returned 1 exit status
make[2]: *** [...] Error 1
make[1]: *** [CMakeFiles/annotate.dir/all] Error 2
make: *** [all] Error 2
来自我的主要方法。
是否可以使用功能模板执行此操作,是否有意义?
答案 0 :(得分:2)
似乎那些函数定义(特别是setPixel()
的两个非模板重载)来自一个头文件,它被包含在多个翻译单元中(即.cpp
文件),因此违反一个定义规则。
如果您希望这些函数的定义出现在头文件中,请将它们声明为inline
:
inline void setPixel(int j, int i, unsigned char v, QImage & img)
{
img.setPixel(j, i, qRgb(v, v, v));
}
inline void setPixel(int j, int i, cv::Vec3b v, QImage & img)
{
img.setPixel(j, i, qRgb(v[2], v[1], v[0]));
}