Я проверил похожие теги, но не могу понять, что я делаю неправильно.
Я пытаюсь использовать библиотеку CImg, и я впервые работаю с шаблонами в C ++.
Я в процессе переноса некоторых из моих средств обработки изображений для работы с этой библиотекой, и у меня возникли некоторые проблемы. Надеюсь, кто-то здесь может меня поправить!
У меня есть основной файл, где я играю с CImg, чтобы посмотреть, что он может сделать, сейчас я просто использую его как песочницу. Я создал файл заголовка с некоторыми шаблонными функциями (поскольку мои файлы .cpp не работали правильно), который включает мою библиотеку ( CN ) и библиотеку CImg . Созданные мной функции шаблона работают без проблем, если только они не используют библиотеку CN . То есть,
cn_cimg_get_RGBtoGray(tinyImg)
работает как задумано. Я получаю следующее от gcc
main.cpp:54: error: no matching function for call to 'cn_cimg_get_CNtoCImg(CN::cnImage&)
Когда я скомпилирую с
g++ -Icn -Icimg -o cimg.bin main.cpp cn/cn_matrix.cpp cn/cn_image.cpp \
-lpthread -lX11 -lgdi32
Ниже приведен соответствующий код; или так надеюсь.
Вот мой main.cpp
#include "cn_image.h"
#include "cn_cimg.hpp"
#include "CImg.h"
using namespace cimg_library;
using namespace CN;
int main(int argv, char **argc) {
cout << "MAIN RUNNING" << endl;
srand( time(NULL) );
// Create CImg Stuff (New)
CImg<unsigned char> tinyImg("16x16.gif");
CImg<unsigned char> gray = cn_cimg_get_RGBtoGray(tinyImg);
// Create cnImage (Old)
cnImage cn;
cn_create(&cn, tinyImg.width(), tinyImg.height());
// Copy tinyImg to cn manually
cimg_forXY(tinyImg, x, y){
cn.r.data[x][y] = tinyImg(x, y, CHANNEL_R);
cn.g.data[x][y] = tinyImg(x, y, CHANNEL_G);
cn.b.data[x][y] = tinyImg(x, y, CHANNEL_B);
}
// Create new CImg and try conversion function
CImg<unsigned char> fromCN = cn_cimg_get_CNtoCImg(cn);
// Check if fromCN is tinyImg
fromCN.display();
// Clean up cnImage Memory
cn_destroy(&cn);
return 0;
}
Вот cn_cimg.hpp
#include "cn_image.h"
#include "CImg.h"
using namespace cimg_library;
namespace CN {
static const int CHANNEL_R = 0;
static const int CHANNEL_G = 1;
static const int CHANNEL_B = 2;
// Converts RGB to GrayScale and Returns a new CImg
template <class CImg>
CImg cn_cimg_get_RGBtoGray(const CImg& img)
{
// Create Single Channel (Gray) Image
CImg temp(img.width(), img.height(), 1);
cimg_forXY(img, x, y)
{
temp(x, y) = ( img(x, y, CHANNEL_R) + img(x, y, CHANNEL_G) + img(x, y, CHANNEL_B) ) / 3.0f;
}
return temp;
}
// cnImage to CImage conversions
template <class CImg>
CImg cn_cimg_get_CNtoCImg(const cnImage &cn)
{
// Confirm cnImage has stuff
if(!cn_isAlloc(&cn))
{
// If not, return basic CImg
CImg cimg(1,1,1,3);
return cimg;
}
// Create a CImg with 3 Channels (RGB)
CImg cimg(cn.rgb.cols, cn.rgb.rows, 1, 3);
// Copy the Channels
cimg_forXY(cimg, x, y)
{
cimg(x, y, CHANNEL_R) = cn.r.data[x][y];
cimg(x, y, CHANNEL_G) = cn.g.data[x][y];
cimg(x, y, CHANNEL_B) = cn.b.data[x][y];
}
return cimg;
}
}
Я действительно понятия не имею, почему я не могу сопоставить функции, но я обычно сталкиваюсь с этими проблемами, когда делаю что-то в первый раз. Кроме того, если кто-то увидит какой-нибудь плохой стиль или еще много чего в моих шаблонах, я с удовольствием приму некоторую критику. Спасибо всем.