在本教程中,您将学习如何:
在本教程中,我们将大量使用两种结构: cv::P oint 和 cv::Scalar :
它表示一个 2D 点,由其图像坐标 和 y 指定。我们可以将其定义为:xy
或
#include < opencv2/core.hpp>#include < opencv2/imgproc.hpp>#include < opencv2/highgui.hpp>#define w 400使用命名空间 CV;无效MyEllipse( 垫子 img, 双角 );无效MyFilledCircle( 垫子 img, 点心 );无效MyPolygon( 垫子 img );无效MyLine( 垫子 img, 点开始, 点结束 );int main( 无效 ){char atom_window[] = “图1:原子”;char rook_window[] = “图纸 2:车”;垫子 atom_image = 垫子::零( w, w, CV_8UC3 );垫子 rook_image = 垫子::零( w, w, CV_8UC3 );MyEllipse( atom_image, 90 );MyEllipse( atom_image, 0 );MyEllipse( atom_image, 45 );MyEllipse( atom_image, -45 );MyFilledCircle( atom_image, Point( w/2, w/2) );MyPolygon( rook_image );矩形( rook_image,点( 0, 7*w/8 ),点( w, w),标量( 0, 255, 255 ),填充,LINE_8 );MyLine( rook_image, 点( 0, 15*w/16 ), 点( w, 15*w/16 ) );MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) );MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) );MyLine( rook_image, 点( 3*w/4, 7*w/8 ), 点( 3*w/4, w ) );imshow( atom_window, atom_image );moveWindow( atom_window, 0, 200 );imshow( rook_window, rook_image );moveWindow( rook_window, w, 200 );waitKey( 0 );返回(0);}无效MyEllipse( Mat img, 双角 ){int 厚度 = 2;int lineType = 8;椭圆( img,点( w/2, w/2 ),尺寸( w/4, w/16 ),角度0,360,标量( 255, 0, 0 ),厚度线型 );}无效MyFilledCircle(垫子img,点心){圆( img,中心W/32,标量( 0, 0, 255 ),填充,LINE_8 );}无效MyPolygon(垫子img){int lineType = LINE_8;第rook_points点[1][20];rook_points[0][0] = 点( w/4, 7*w/8 );rook_points[0][1] = 点( 3*w/4, 7*w/8 );rook_points[0][2] = 点( 3*w/4, 13*w/16 );rook_points[0][3] = 点( 11*w/16, 13*w/16 );rook_points[0][4] = 点( 19*w/32, 3*w/8 );rook_points[0][5] = 点( 3*w/4, 3*w/8 );rook_points[0][6] = 点( 3*w/4, w/8 );rook_points[0][7] = 点( 26*w/40, w/8 );rook_points[0][8] = 点( 26*w/40, w/4 );rook_points[0][9] = 点( 22*w/40, w/4 );rook_points[0][10] = 点( 22*w/40, w/8 );rook_points[0][11] = 点( 18*w/40, w/8 );rook_points[0][12] = 点( 18*w/40, w/4 );rook_points[0][13] = 点( 14*w/40, w/4 );rook_points[0][14] = 点( 14*w/40, w/8 );rook_points[0][15] = 点( w/4, w/8 );rook_points[0][16] = 点( w/4, 3*w/8 );rook_points[0][17] = 点( 13*w/32, 3*w/8 );rook_points[0][18] = 点( 5*w/16, 13*w/16 );rook_points[0][19] = 点( w/4, 13*w/16 );const Point* ppt[1] = { rook_points[0] };int npt[] = { 20 };fillPoly( img,ppt,不扩散核武器条约,1,标量( 255, 255, 255 ),线型 );}无效MyLine(垫子img,点开始,点结束){int 厚度 = 2;int lineType = LINE_8;线( img,开始结束标量( 0, 0, 0 ),厚度线型 );}
由于我们计划绘制两个示例(一个原子和一个车),因此我们必须创建两个图像和两个窗口来显示它们。
char atom_window[] = “图1:原子”;char rook_window[] = “图纸 2:车”;垫子 atom_image = 垫子::零( w, w, CV_8UC3 );垫子 rook_image = 垫子::零( w, w, CV_8UC3 );
我们创建了用于绘制不同几何形状的函数。例如,为了绘制原子,我们使用了 MyEllipse 和 MyFilledCircle:
MyEllipse( atom_image, 90 );MyEllipse( atom_image, 0 );MyEllipse( atom_image, 45 );MyEllipse( atom_image, -45 );
为了绘制车,我们使用了 MyLine、矩形和 MyPolygon:
MyPolygon( rook_image );矩形( rook_image,点( 0, 7*w/8 ),点( w, w),标量( 0, 255, 255 ),填充,LINE_8 );MyLine( rook_image, 点( 0, 15*w/16 ), 点( w, 15*w/16 ) );MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) );MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) );MyLine( rook_image, 点( 3*w/4, 7*w/8 ), 点( 3*w/4, w ) );
让我们检查一下这些函数中的每一个都包含哪些内容:
{int 厚度 = 2;int lineType = LINE_8;线( img,开始结束标量( 0, 0, 0 ),厚度线型 );}
{int 厚度 = 2;int lineType = 8;椭圆( img,点( w/2, w/2 ),尺寸( w/4, w/16 ),角度0,360,标量( 255, 0, 0 ),厚度线型 );}
{int lineType = LINE_8;第rook_points点[1][20];rook_points[0][0] = 点( w/4, 7*w/8 );rook_points[0][1] = 点( 3*w/4, 7*w/8 );rook_points[0][2] = 点( 3*w/4, 13*w/16 );rook_points[0][3] = 点( 11*w/16, 13*w/16 );rook_points[0][4] = 点( 19*w/32, 3*w/8 );rook_points[0][5] = 点( 3*w/4, 3*w/8 );rook_points[0][6] = 点( 3*w/4, w/8 );rook_points[0][7] = 点( 26*w/40, w/8 );rook_points[0][8] = 点( 26*w/40, w/4 );rook_points[0][9] = 点( 22*w/40, w/4 );rook_points[0][10] = 点( 22*w/40, w/8 );rook_points[0][11] = 点( 18*w/40, w/8 );rook_points[0][12] = 点( 18*w/40, w/4 );rook_points[0][13] = 点( 14*w/40, w/4 );rook_points[0][14] = 点( 14*w/40, w/8 );rook_points[0][15] = 点( w/4, w/8 );rook_points[0][16] = 点( w/4, 3*w/8 );rook_points[0][17] = 点( 13*w/32, 3*w/8 );rook_points[0][18] = 点( 5*w/16, 13*w/16 );rook_points[0][19] = 点( w/4, 13*w/16 );const Point* ppt[1] = { rook_points[0] };int npt[] = { 20 };fillPoly( img,ppt,不扩散核武器条约,1,标量( 255, 255, 255 ),线型 );}
编译和运行程序应该得到这样的结果:
有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取
第一阶段:零基础入门(3-6个月)
新手应首先通过少而精的学习,看到全景图,建立大局观。 通过完成小实验,建立信心,才能避免“从入门到放弃”的尴尬。因此,第一阶段只推荐4本最必要的书(而且这些书到了第二、三阶段也能继续用),入门以后,在后续学习中再“哪里不会补哪里”即可。
第二阶段:基础进阶(3-6个月)
熟读《机器学习算法的数学解析与Python实现》并动手实践后,你已经对机器学习有了基本的了解,不再是小白了。这时可以开始触类旁通,学习热门技术,加强实践水平。在深入学习的同时,也可以探索自己感兴趣的方向,为求职面试打好基础。
第三阶段:工作应用
这一阶段你已经不再需要引导,只需要一些推荐书目。如果你从入门时就确认了未来的工作方向,可以在第二阶段就提前阅读相关入门书籍(对应“商业落地五大方向”中的前两本),然后再“哪里不会补哪里”。
有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取