pixel* Cartoon(pixel* image, int lines, int colors, int width, int height, pixel* output) { int i, length; length = width * height; pixel* copy = pixel_copy(image, width, height); Sobel_Edges(image, 0, 0, width, height, output); // custom threshold for multiplication for(i = 0; i < length; i++) { pixel oldPixel = output[i]; if(oldPixel.red > lines) oldPixel.red = oldPixel.blue = oldPixel.green = 0; else oldPixel.red = oldPixel.blue = oldPixel.green = 1; output[i] = oldPixel; } Posterize(copy, colors, width, height, copy); for(i = 0; i < length; i++) { pixel outputPixel = output[i]; pixel copyPixel = copy[i]; outputPixel.red *= copyPixel.red; outputPixel.blue *= copyPixel.blue; outputPixel.green *= copyPixel.green; output[i] = outputPixel; } free(copy); return output; }
void CHandDrawEffect::EffectImage(IplImage* back, IplImage* frame, IplImage* alpha, IplImage* mask, IplImage* res) { if(drawMode & 0x01) { //基本エフェクト Posterize(0xD0, frame, imageA); // DrawHatching(frame, imageA); cvAnd(imageA, mask, imageB); //エフェクト処理後のCG部分のくりぬき //囲み cvNot(mask, imageA); cvDilate(imageA, imageD, 0, 1); cvDilate(mask, imageE, 0, 3); cvXor(imageE, imageD, mask); //アルファマスク更新 cvNot(mask, imageA); cvConvertScale(imageA, imageA, 0.5); cvOr(alpha, imageA, alpha); //色付きの囲み cvNot(mask, imageA); cvAnd(imageA, imageC, imageA); cvOr(imageA, imageB, imageB); //走査線 cvAnd(imageB, scanningLine, imageB); //アルファブレンド AlphaBlend(back, imageB, alpha, res); if(0) { //drawMode & 0x02) { // DrawEdge(frame, imageB, res, 2); cvNot(mask, frame); cvDilate(frame, imageA, 0, 1); cvDilate(mask, imageB, 0, 3); cvXor(imageA, imageB, mask); cvAnd(mask, res, res); //色付きの線 cvNot(mask, imageA); cvAnd(imageA, scanningLine, imageA); cvAnd(imageA, imageC, imageA); cvOr(res, imageA, res); } } else if(drawMode & 0x02) { // DrawEdge(frame, imageB, res, 2); } }