C++ opencv两段让头发变色的两段代码,都是从其它网站抄的,都运行不了,先弄个记录先

cv::Mat Tools::ColorHairTwo(cv::Mat &srcImag, uchar r, uchar g, uchar b)
{
	//https://download.csdn.net/download/kongrenxin/10231754
	cv::Mat hairMat = srcImag.clone(); //?cv::imread(argv[1], -1);
	cv::Mat hairBak = hairMat.clone();

	int size = hairMat.cols*hairMat.rows * 3 / 2;

	cv::Mat colorMat(4, 4, CV_8UC3);
	for (int i = 0; i<colorMat.rows; i++)
	{
		for (int j = 0; j<colorMat.cols; j++)
		{
			cv::Vec3b& c = colorMat.at<cv::Vec3b>(i, j);
			c[2] = r;
			c[1] = g;
			c[0] = b;
		}
	}

	cv::Mat colorYuvMat;
	colorYuvMat.release();
	cv::cvtColor(colorMat, colorYuvMat, CV_BGR2YUV_I420);
	uchar u = colorYuvMat.data[colorMat.cols*colorMat.rows];
	uchar v = colorYuvMat.data[colorMat.cols*colorMat.rows * 5 / 4];

	int posu = hairMat.cols*hairMat.rows;
	int posv = hairMat.cols*hairMat.rows * 5 / 4;

	cv::Mat hairYuvMat;
	cv::cvtColor(hairMat, hairYuvMat, CV_BGRA2YUV_I420);
	for (int i = 0; i<hairMat.cols*hairMat.rows / 4; i++)
	{
		hairYuvMat.data[posu + i] = u;
		hairYuvMat.data[posv + i] = v;
	}

	cv::cvtColor(hairYuvMat, hairMat, CV_YUV2BGRA_I420);

	//还原原图的透明度效果
	for (int i = 0; i<hairBak.rows; i++)
	{
		for (int j = 0; j<hairBak.cols; j++)
		{
			const cv::Vec4b& cc = hairBak.at<cv::Vec4b>(i, j);
			cv::Vec4b& c = hairMat.at<cv::Vec4b>(i, j);
			c[3] = cc[3];
		}
	}
	imwrite("colorHair.png", hairMat);
	//IplImage ipl= IplImage(hairMat);
	//cvSaveImage("colorHair.png", &ipl);
	return hairMat;
}

cv::Mat Tools::ColorHair(cv::Mat &hairMat1,int r,int g,int b)
{//https://baijiahao.baidu.com/s?id=1591677316693378589&wfr=spider&for=pc
	//OpenCV之 图像染色 https://blog.csdn.net/ilson_/article/details/89553334
	//?cv::Mat hairBak = hairMat.clone();
	cv::Mat hairBak = imread("./images/meirong/Jiafa/mtsc11290.png");
	cv::Mat hairMat = imread("./images/meirong/Jiafa/mtsc11290.png");
	cv::Mat colorMat(4,4,CV_8UC3);
	for (int i = 0; i < colorMat.rows; i++)
	{
		for (int j = 0; j < colorMat.cols; j++)
		{
			cv::Vec3b&c = colorMat.at<cv::Vec3b>(i, j);
			c[2] = r;
			c[1] = g;
			c[0] = b;
		}
	}
	cv::Mat colorYuvMat;
	cv::cvtColor(colorMat, colorYuvMat, CV_BGR2YUV_I420);
	uchar u = colorYuvMat.data[colorMat.cols*colorMat.rows];
	uchar v = colorYuvMat.data[colorMat.cols*colorMat.rows*5/4];

	int posu = hairMat.cols*hairMat.rows;
	int posv = hairMat.cols*hairMat.rows*5/4;

	cv::Mat hairYuvMat;
	cv::cvtColor(hairMat, hairYuvMat, CV_BGRA2YUV_I420);
	for (int i = 0; i < hairMat.cols*hairMat.rows/4; i++)
	{
		hairYuvMat.data[posu+i] = u;
		hairYuvMat.data[posv + i] = v;
	}
	imwrite("515.png", hairYuvMat);
	imwrite("516.png", hairMat);

	cv::cvtColor(hairYuvMat , hairMat, CV_YUV2BGRA_I420);
	//还原原图的透明效果
	for (int i = 0; i < hairBak.rows; i++)
	{
		for (int j = 0; j < hairBak.cols; j++)
		{
			//?if (j < 126) 126的时候会出错
			{
				const cv::Vec4b& cc = hairBak.at<cv::Vec4b>(i, j);
				cv::Vec4b&c = hairMat.at<cv::Vec4b>(i, j);
				c[3] = cc[3];
			}
			
		}
	}
	imwrite("517.png", hairBak);
	imwrite("518.png", hairMat);
	return hairMat;
}

利用opencv对头发图像做染色效果

opencv对头发图片进行颜色渲染源代码_头发染色-C++代码类资源-CSDN下载

OpenCV之 图像染色_Ilson_的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值