opencv3 用椭圆画一颗心并签名

1、纯手工用cv::ellipse椭圆函数实现,位置、长短轴大小均为人为调整

#include<opencv.hpp>  

int main()
{
	cv::Mat image = cv::Mat::ones(480, 640, CV_32FC3);

	image.setTo(cv::Scalar(255, 255, 255));

	cv::ellipse(image,cv::Point(313,178),cv::Size(70,100),0,40,140,cv::Scalar(0,0,255),2,8);

	cv::ellipse(image, cv::Point(286, 220), cv::Size(50, 35), 225, 270, 452, cv::Scalar(0, 0, 255), 2, 8);

	cv::ellipse(image, cv::Point(340, 220), cv::Size(50, 35), -45, 268, 450, cv::Scalar(0, 0, 255), 2, 8);

	cv::putText(image, "Ben", cv::Point(400, 320), 7, 1, cv::Scalar(0, 0, 20), 1, 8, false);

	cv::imwrite("result.jpg", image);

	cv::namedWindow("My window");
	cv::imshow("My window", image);
	cv::waitKey(0);
	cv::destroyWindow("My window");
	return 0;
}

效果如下图:
在这里插入图片描述
2、人为调整椭圆位置、角度等未免有些麻烦,偷懒一下,利用心形曲线公式实现,所参考心形曲线公式为
在这里插入图片描述
由于在图片中,每个点的坐标都是离散的,故将右端数字做一修正,限制在一个带内,并不是直接判断是否相等。
代码如下:

#include<opencv.hpp>  

int main()
{
	int h = 480;
	int w = 640;

	int b = 0, g = 0, r = 255;


	cv::Mat image = cv::Mat::ones(h, w, CV_32FC3);

	image.setTo(cv::Scalar(255, 255, 255));

	int axis_x, axis_y;
	for (int i=0; i < h; i++)
	for (int j=0; j < w; j++)
	{
		axis_y = 240-i;
		axis_x = j - 320;

		//5*pow(x,2)-6*abs(x)*y+5*pow(y,2)==128
		int left = 5 * pow(axis_x, 2) - 6 * abs(axis_x)*axis_y + 5 * pow(axis_y, 2);
		if (left< 14000&&left>12000)
		{
			image.at<cv::Vec3f>(i, j)[0] = b;
			image.at<cv::Vec3f>(i, j)[1] = g;
			image.at<cv::Vec3f>(i, j)[2] = r;
		}
	}
	cv::putText(image, "Ben", cv::Point(400, 320), 7, 1, cv::Scalar(0, 0, 20), 1, 8, false);

	cv::imwrite("result.jpg", image);

	cv::namedWindow("My window");
	cv::imshow("My window", image);
	cv::waitKey(0);
	cv::destroyWindow("My window");
	return 0;
}

画出来的心如图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34662299/article/details/86030688