实例:图形绘制[OpenCV 笔记15]
DrawShapes.cxx
# include "DrawShapes_utils.h" #define WINDOW_NAME1 "Painting 1"
#define WINDOW_NAME2 "Painting 2" // main
int main( void )
{
// crate Mat image
cv::Mat atomImage = cv::Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3);
cv::Mat rookImage = cv::Mat::zeros(WINDOW_WIDTH, WINDOW_WIDTH, CV_8UC3); // draw image 1
// 1) draw ellipses
DrawEllipse( atomImage, );
DrawEllipse( atomImage, );
DrawEllipse( atomImage, );
DrawEllipse( atomImage, - ); // 2) draw circle
DrawFilledCircle(atomImage, cv::Point(WINDOW_WIDTH/, WINDOW_WIDTH/)); // draw image 2
// 1) draw polygon
DrawPolygon( rookImage ); // 2) draw rectangle
cv::rectangle(rookImage,
cv::Point(, *WINDOW_WIDTH/),
cv::Point(WINDOW_WIDTH, WINDOW_WIDTH),
cv::Scalar( , , ),
-,
);
// 3) draw line segments
DrawLine(rookImage, cv::Point(, *WINDOW_WIDTH/), cv::Point(WINDOW_WIDTH, *WINDOW_WIDTH/));
DrawLine(rookImage, cv::Point(WINDOW_WIDTH/, *WINDOW_WIDTH/), cv::Point(WINDOW_WIDTH/, WINDOW_WIDTH));
DrawLine(rookImage, cv::Point(WINDOW_WIDTH/, *WINDOW_WIDTH/), cv::Point(WINDOW_WIDTH/, WINDOW_WIDTH));
DrawLine(rookImage, cv::Point(*WINDOW_WIDTH/, *WINDOW_WIDTH/), cv::Point(*WINDOW_WIDTH/, WINDOW_WIDTH)); // show images
cv::imshow( WINDOW_NAME1, atomImage );
cv::moveWindow( WINDOW_NAME1, , );
cv::imshow( WINDOW_NAME2, rookImage );
cv::moveWindow( WINDOW_NAME2, WINDOW_WIDTH, ); cv::imwrite("atomImage.jpg", atomImage);
cv::imwrite("rookImage.jpg", rookImage); cv::waitKey(); return ;
}
DrawShapes_utils.h
#ifndef DRAWSHAPES_H_
#define DRAWSHAPES_H_ #include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#define WINDOW_WIDTH 600 // draw ellipse with the same size but different angle
void DrawEllipse( cv::Mat img, double angle ); // draw filled circle
void DrawFilledCircle( cv::Mat img, cv::Point center ); // draw polygon
void DrawPolygon( cv::Mat img ); // draw line
void DrawLine( cv::Mat img, cv::Point start, cv::Point end ); #endif // DRAWSHAPES_H_
DrawShapes_utils.cxx
#include "DrawShapes_utils.h" // draw ellipse with the same size but different angle
void DrawEllipse( cv::Mat img, double angle )
{
int thickness = ;
int lineType = ; ellipse( img,
cv::Point( WINDOW_WIDTH/, WINDOW_WIDTH/ ), // center point
cv::Size(WINDOW_WIDTH/, WINDOW_WIDTH/), // bounding box
angle, // rotation angle
, // arc start from 0 degree
, // to 360 degrees
cv::Scalar(,,), // color of the ellipse
thickness, // line width
lineType); // line type: 8 neighbor connected line
} // draw filled circle
void DrawFilledCircle( cv::Mat img, cv::Point center )
{
int thickness = -;
int lineType = ; cv::circle( img,
center,
WINDOW_WIDTH/, // radius
cv::Scalar(, , ), // color
thickness, // line width: -1 filled
lineType); // line type
} // draw polygon
void DrawPolygon( cv::Mat img )
{
int lineType = ; // create points
cv::Point rookPoints[][];
rookPoints[][] = cv::Point( WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( WINDOW_WIDTH/, WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( *WINDOW_WIDTH/, *WINDOW_WIDTH/ );
rookPoints[][] = cv::Point( WINDOW_WIDTH/, *WINDOW_WIDTH/ ); const cv::Point* ppt[] = {rookPoints[]};
int npt[] = {}; cv::fillPoly( img,
ppt, // vertices
npt, // number of vertices
, // number of polygon to draw
cv::Scalar(, , ), //color of polygon
lineType);
} // draw line
void DrawLine( cv::Mat img, cv::Point start, cv::Point end )
{
int thickness = ;
int lineType = ;
cv::line( img,
start, // start point
end, // end point
cv::Scalar(, , ), // color of line
thickness, // line width
lineType); // line type
}
CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (DrawShapes) # find OpenCV packages
find_package( OpenCV REQUIRED PATHS /usr/local/Cellar/opencv3/3.1.0_3/share/OpenCV/)
include_directories( ${OpenCV_INCLUDE_DIRS} ) # add the executable
add_executable (DrawShapes DrawShapes.cxx DrawShapes_utils.h DrawShapes_utils.cxx)
target_link_libraries(DrawShapes opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs)
atomImage

rookImage

实例:图形绘制[OpenCV 笔记15]的更多相关文章
- 图像显示 imshow()[OpenCV 笔记5]
void imshow(const string& winname InputArray mat); winname 窗口表识名称 mat 需要显示的图像.InputArray类型,声明如下 ...
- 查找并绘制轮廓[OpenCV 笔记XX]
好久没有更新了,原谅自己放了个假最近又在赶进度,所以...更新的内容是很靠后的第八章,因为最近工作要用就先跳了,后面会更新笔记编号...加油加油! 在二值图像中寻找轮廓 void cv::findCo ...
- 实例:图像载入、显示、混合与输出[OpenCV 笔记8]
是的是的,忍着尿意努力更新,就是为了更到wuli男神的部分,当然要把男神放在前面镇楼,欢迎下载配图,具体操作见code wuliEddie.jpg logo.png results.jpg LoadS ...
- 视频处理简单实例 [OpenCV 笔记2]
VideoCapture是OpenCV 2.X中新增的类,提供从摄像机或视频文件捕获视频的C++接口.利用它读入视频的方法一般有两种: // method 1 VideoCapture capture ...
- 图像处理简单实例[OpenCV 笔记1]
几个入门的简单程序,和对应的CMakeList, 虽然简单重新测一下写一下也是好的. CMake教程传送门 图像显示 ShowImage.cxx #include <opencv2/opencv ...
- OpenCV基本架构[OpenCV 笔记0]
最近正在系统学习OpenCV,将不定期发布笔记,主要按照毛星云的<OpenCV3编程入门>的顺序学习,会参考官方教程和文档.学习工具是Xcode+CMake,会对书中一部分内容更正,并加入 ...
- 滑动条 Trackbar[OpenCV 笔记9]
OpenCV中没有实现按钮的功能,我们可以利用滑动条来实现按钮功能. , ); trackbarname 轨迹条的名字. winname 窗口的名字,轨迹条会依附在这个窗口上. value 一个指向整 ...
- 输出图像到文件 imwrite()[OpenCV 笔记7]
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector& ...
- 访问图像中的像素[OpenCV 笔记16]
再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...
随机推荐
- sudo 和 sudoers设置
转: http://www.cnblogs.com/zhuowei/archive/2009/04/13/1435190.html sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许 ...
- ios中的容器类 ViewController
https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/AboutViewContro ...
- canvas createRadialGradient 用法
径向渐变,就是环形的渐变了,由圆心(或者是较小的同心圆)开始向外扩散渐变的效果,听着有些抽象,往下看图一下子就明白了.线性渐变指定了起点和终点,径向渐变则指定了开始的结束园的圆心和半径.这里使用cre ...
- Code Smell那么多,应该先改哪一个?
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Code Smell那么多,应该先改哪一个?.
- lock语句的递归问题
原文地址 前几天在网上闲逛,无意中看到有这么一道题及其答案,如下: 根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由. ) { i--; tes ...
- Android开发:TextView真正可控、不需要焦点的水平滚动--这才是真正的跑马灯
网上的TextView做跑马灯,大多都是要用到焦点,而且字数要超出滚动区域宽度才能实现滚动,使用起来十分不方便. 这里实现一种真正可控的滚动 (1)不需要焦点 (2)任意字数 (3)滚动从滚动区域右边 ...
- Java中字符流与字节流的区别
字符流处理的单元为2个字节的Unicode字符,分别操作字符.字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组.所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单 ...
- CLOSE_WAIT状态的原因与解决方法 --转
转自:http://blog.chinaunix.net/uid-20357359-id-1963662.html 这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司 ...
- Iperf使用方法
Iperf使用方法 Iperf 是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包 ...
- Dom4j 学习笔记
dom4j 是一种解析 XML 文档的开放源代码 XML 框架.dom4j下载地址 本文主要记载了一些简单的使用方法. 一.xml文件的解析 dom4j既可以解析普通的xml文件,也可以解析一个Inp ...