類似のタグをチェックしましたが、私が間違っていることを見つけることができません。 私はCImgライブラリを使用しようとしています。これは初めてC++のテンプレートを使って作業しています。
私はこのライブラリで作業するために画像処理用のものを移植する途中ですが、少し苦労しました。うまくいけば、ここの誰かが私をまっすぐにすることができる!
私はCImgで何ができるのか見るためにメインファイルを持っていますが、今はちょうどサンドボックスとして使っています。私のライブラリ(CN)とCImgライブラリを含むいくつかのテンプレート関数(私の.cppファイルは正しく動作しなかったので)を使ってヘッダファイルを作成しました。作成したテンプレート関数は、CNライブラリも使用しない限り、問題なく動作します。つまり、 cn_cimg_get_RGBtoGray(tinyImg)
は意図したとおりに動作します。私は以下
g++ -Icn -Icimg -o cimg.bin main.cpp cn/cn_matrix.cpp cn/cn_image.cpp \ -lpthread -lX11 -lgdi32
C++、ネームスペース、テンプレート、およびマッチング関数呼び出しなし
該当するコードがあるとコンパイルすると、GCC
main.cpp:54: error: no matching function for call to 'cn_cimg_get_CNtoCImg(CN::cnImage&)
から次取得しています。それで、私は願っています。
がここにここに私の 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;
}
}
です私は本当に私は機能と一致しないことができる理由はわかりませんが、私は通常、初めて何かをするときにこれらの問題にぶつかります。また、誰かが私のテンプレートに悪いスタイルやその他のものを見た場合、私は喜んで批判します。みんな、ありがとう。
完璧!ありがとう。これはCImgが入力されていないので返されるジェネリックのタイプを知る方法がないためですか? – Sapiens
正確です。あなたは、あなたのcnImageを任意のタイプのCImgに変換する自由を持っています。コンパイラはどちらがどれかを知らない。 –