opencv3 用橢圓畫一顆心並簽名
阿新 • • 發佈:2019-01-14
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; }
畫出來的心如圖: