Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
	}
}