打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
20120419-opencv2.3绘制抛物线
OpenCV2.3中的自带有绘制直线,圆,椭圆,矩形的函数,但有时候需要绘制一些其他曲线,如抛物线,就得自己编写函数了。以下示例利用抛物线方程以及OpenCV函数实现了绘制抛物线的函数。废话不多说,直接上代码。
注:该函数只能绘制开口向上或向下的抛物线,且中轴平行于y轴;开口向左或向右的抛物线由于公式不一样,所以不能绘制。
01 /**
02     根据给定的三个点绘制抛物线
03     注:是开口向上或向下的抛物线
04 */
05 
06 #include <cv.h>
07 #include <highgui.h>
08 #include <iostream>
09 #include <vector>
10 #include <math.h>
11 
12 using namespace std;
13 using namespace cv;
14 
15 /**
16     给定三个点画抛物线
17     @param image 绘制抛物线的图像
18     @param pL 点1,左边点
19     @param pM 点2,中间点
20     @param pR 点3,右边点
21     @param color 线条颜色
22 */
23 void parabola(Mat &image, Point pL, Point pM, Point pR, const Scalar &color = Scalar(00255), int thickness = 1);
24 
25 int main(int argc, char *argv[])
26 {
27     const string winName = "test";
28     Mat image = Mat::zeros(480640, CV_8UC3);
29     Point pL(200200);
30     Point pM(300150);
31     Point pR(400200);
32     parabola(image, pL, pM, pR);
33 
34     namedWindow(winName, 1);
35     imshow(winName, image);
36     waitKey(0);
37     return 1;
38 }
39 
40 void parabola(Mat &image, Point pL, Point pM, Point pR, const Scalar &color, int thickness)
41 {
42     /*
43     *抛物线函数y=ax^2+bx+c
44     *已知三个点的横纵坐标为:(x_1, y_1),(x_2, y_2), (x_3, y_3)
45     *关于a,b,c的三元方程组
46     *    ax_1^2+bx_1+c=y_1
47     *    ax_2^2+bx_2+c=y_2
48     *    ax_3^2+bx_3+c=y_3
49     *可得:
50     *    a=[(y_1-y_2)/(x_1-x_2)-(y_1-y_3)/(x_1-x_3)]/(x_2-x_3)
51     *    b=(y_1-y_2)/(x_1-x_2)-a(x_1+x_2)
52     *    c=y_1-ax_1^2-bx_1
53     */
54     double x1, y1, x2, y2, x3, y3, a, b, c;
55     x1 = (double)pL.x;
56     y1 = (double)pL.y;
57     x2 = (double)pM.x;
58     y2 = (double)pM.y;
59     x3 = (double)pR.x;
60     y3 = (double)pR.y;
61     a = ((y1-y2)/(x1-x2)-(y1-y3)/(x1-x3)) / (x2-x3);
62     b = (y1-y2)/(x1-x2)-a*(x1+x2);
63     c = y1-a*x1*x1-b*x1;
64     //x的变化范围是[x1, x3],三像素画一个点
65     int x;
66     double y;
67     vector<Point> pt;
68     for (x = int(x1); x <= int(x3); x = x+3)
69     {
70         y = a * double(x) * double(x) + b * double(x) + c;
71         pt.push_back(Point(x, int(y)));
72     }
73     pt.push_back(Point(int(x3), int(y3)));
74     for (int i = 0; i < pt.size()-1; i++)
75     {
76         line(image, pt[i], pt[i+1], color);
77     }
78     //此处标注出给定的三个点
79     circle(image, Point(pL), 3, color, -1);
80     circle(image, Point(pM), 3, color, -1);
81     circle(image, Point(pR), 3, color, -1);
82 }

绘制结果如下:
 
 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
14张图让你彻底弄懂“函数”!轻松破解中考压轴题!
14张图让你彻底弄懂“函数”
【中考数学课堂】第120课
OpenCV学习笔记(五十一)——imge stitching图像拼接stitching
opencv 取整数,四舍五入,向上取整,向下取整
14张图让你彻底弄懂“函数”!轻松破解中考压轴题!没开玩笑!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服