#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void MyLines(Mat &srcImage);
void MyRectangle(Mat &srcImage);
void MyEllipse(Mat &srcImage);
void MyCircle(Mat &srcImage);
void MyPolygon(Mat &srcImage);
void RandomLineDemo(Mat &srcImage);
int main()
{
Mat srcImage = imread("D:demo01.jpg");
if (!srcImage.data)
{
cout << "could not load image..." << endl;
return -1;
}
namedWindow("原图", CV_WINDOW_AUTOSIZE);
imshow("原图", srcImage);
cout << srcImage.size();
//MyLines(srcImage);
//namedWindow("MyLines", CV_WINDOW_AUTOSIZE);
//imshow("MyLines", srcImage);
//MyRectangle(srcImage);
//namedWindow("MyRectangle", CV_WINDOW_AUTOSIZE);
//imshow("MyRectangle", srcImage);
//MyEllipse(srcImage);
//namedWindow("MyEllipse", CV_WINDOW_AUTOSIZE);
//imshow("MyEllipse", srcImage);
//MyCircle(srcImage);
//namedWindow("MyCircle", CV_WINDOW_AUTOSIZE);
//imshow("MyCircle", srcImage);
//MyPolygon(srcImage);
//namedWindow("MyCircle", CV_WINDOW_AUTOSIZE);
//imshow("MyCircle", srcImage);
//绘制文字cvPutText函数
//void cv::putText(
// cv::Mat& img, // 待绘制的图像
// const string& text, // 待绘制的文字
// cv::Point origin, // 文本框的左下角
// int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)
// double fontScale, // 尺寸因子,值越大文字越大
// cv::Scalar color, // 线条的颜色(RGB)
// int thickness = 1, // 线条宽度
// int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)
// bool bottomLeftOrigin = false // true='origin at lower left'
// );
//putText(srcImage,"Hello Opencv",Point(100,100),CV_FONT_HERSHEY_COMPLEX,1.0,Scalar(0,0,255),3,8);
//namedWindow("绘制文字", CV_WINDOW_AUTOSIZE);
//imshow("绘制文字", srcImage);
RandomLineDemo(srcImage);
waitKey(0);
return 0;
}
//绘制直线
//void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
// int thickness = 1, int lineType = LINE_8, int shift = 0);
//img:图像.
//pt1:线条起点.
//pt2:线条终点.
//color:线条颜色.
//thickness:线条宽度.
//lineType:线型
void MyLines(Mat &srcImage)
{
Point p1 = Point(20,20);
Point p2;
p2.x = 50;
p2.y = 50;
//Scalar表示四个元素的向量
//Scalar(b, g, r);// b = blue, g = green, r = red表示RGB三个通道
Scalar color = Scalar(0,0,255);//红色
line(srcImage,p1,p2,color,1,LINE_8);
}
// void rectangle(Mat& img,Rect rec, const Scalar&color, intthickness=1, intlineType=8,intshift=0 )
//img:图像。
//rec:表征矩形的位置和长宽。
//color:线条颜色(RGB) 或亮度(灰度图像 )(grayscale image)。
//thickness:组成矩形的线条的粗细程度。取负值时(如CV_FILLED)函数绘制填充了色彩的矩形。
//line_type:线条的类型。见cvLine的描述
//shift:坐标点的小数点位数。
//typedef struct CvRect
//{
// int x; /* 方形的左上角的x-坐标 */
// int y; /* 方形的左上角的y-坐标*/
// int width; /* 宽 */
// int height; /* 高 */
//}
void MyRectangle(Mat &srcImage)
{
Rect rect(100,100,50,50);
Scalar color = Scalar(255,0,0);
rectangle(srcImage,rect,color,2,LINE_8);
}
//椭圆cvEllipse函数
//void ellipse(Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle,
// const Scalar& color, int thickness = 1, int lineType = 8, int shift = 0)
//void cvEllipse(//画椭圆
// CvArr* img,//画布图像
// CvPoint center,//中心点
// CvSize axes,//长短轴
// double angle,//偏离主轴角度
// double start_angle,//弧线开始位置
// double end_angle,//弧线结束位置
// CvScalar color,//颜色
// int thickness = 1,//宽度
// int line_type = 8//
// );
//1).empty() 判断文件读取是否正确
//2).rows 获取图像行数(高度)
//3).cols 获取图像列数(长度)
//4).channels() 获取图像通道数
//5).depth() 获取图像位深度
void MyEllipse(Mat &srcImage) {
Scalar color = Scalar(0, 255, 0);//绿色
ellipse(srcImage, Point(srcImage.cols / 2, srcImage.rows / 2), Size(srcImage.cols / 4, srcImage.rows / 8), 90, 0, 360, color, 2, LINE_8);
}
//void cvCircle(//画圆
// CvArr* array,//画布图像
// CvPoint cevter,//圆心
// int radius,//半径
// CvScalar color,//颜色
// int thickness = 1,//宽度
// int connectivity = 8//反走样
// );
void MyCircle(Mat &srcImage) {
Scalar color = Scalar(0, 255, 255);
Point center = Point(srcImage.cols / 2, srcImage.rows / 2);
circle(srcImage, center, 150, color, 2, 8);
}
//void cvFillPoly(//画多个实心多边形
// CvArr* img,//画布图像
// CvPoint** pts,//点序列
// int* npt,//计数点数组
// int contours,//显示几个多边形
// CvScalar color,//颜色
// int line_type = 8
// );
void MyPolygon(Mat &srcImage) {
Point pts[1][5];
pts[0][0] = Point(100, 100);
pts[0][1] = Point(100, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);
const Point* ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar(255, 12, 255);
fillPoly(srcImage, ppts, npt, 1, color, 8);
}
void RandomLineDemo(Mat &srcImage) {
RNG rng(12345);
Point pt1;
Point pt2;
Mat bg = Mat::zeros(srcImage.size(), srcImage.type());
namedWindow("random line demo", CV_WINDOW_AUTOSIZE);
for (int i = 0; i < 100000; i++)
{
pt1.x = rng.uniform(0,srcImage.cols);//列数 长度
pt1.y = rng.uniform(0,srcImage.rows);//行数 高度
pt2.x = rng.uniform(0,srcImage.cols);
pt2.y = rng.uniform(0,srcImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
if (waitKey(50) > 0) {
break;
}
line(bg, pt1, pt2, color, 1, 8);
imshow("random line demo", bg);
}
}
l
使用
cv::Point
与
cv::Scalar
l
绘制线、矩形、园、椭圆等基本几何形状
l
随机生成与绘制文本
绘制线、矩形、园、椭圆等基本几何形状
l
画线
cv::line
(
LINE_4\LINE_8\LINE_AA
)
l
画椭圆
cv::ellipse
l
画矩形
cv::rectangle
l
画圆
cv::circle
l
画填充
cv::fillPoly
随机数生成cv::RNG
l
生成正态分布随机数
uniform(
int
a,
int
b)
在解释原因之前先了解一下伪随机数,百度里面对计算机产生随机数的过程有详细解释,看不懂也没关系,关于伪随机数记住下面一句话即可:
计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。
注意到程序中有如下一行代码
RNG rng(12345); //随机数产生器
OpenCV里RNG类构造函数初始化为固定的值后随机种子也是固定的,所以在相同的平台环境下,编译后每次运行它,显示的随机数是一样的。
//RNG 伪随机问题
#include <iostream>
#include <opencv2\opencv.hpp>
#include <ctime>
#define n 5
using namespace std;
using namespace cv;
int main()
{
//RNG rng(123);
//RNG类构造函数初始化为固定的值后随机种子也是固定的,那怎样才能不需要更改初始化值,
//同样的代码,同样的编译环境,每次生成的结果都是随机的呢?
//解决办法就是利用系统时间初始化一个随机种子
RNG rng((unsigned)time(NULL)); // initialize with the system time
cout << "Generate 5 random numbers within [1,1000)" << endl;
for (int i = 0; i < n; i++)
{
cout << rng.uniform(1, 1000) << " ";
}
system("pause");
return 0;
}