1. 程式人生 > >opencv3 用橢圓畫一顆心並簽名

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;
}

畫出來的心如圖:
在這裡插入圖片描述