本文共 5914 字,大约阅读时间需要 19 分钟。
putText函数 中设置fontFace(cv::HersheyFonts),
1,绘制直线
void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0) 参数1:img,要绘制线段的图像。 参数2:pt1, 线段的起点。 参数3:pt2,线段的终点。 参数4:color,线段的颜色,通过一个Scalar对象定义。 参数5:thickness, 线条的宽度。 参数6:lineType, 线段的类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波)。 参数7:shift,坐标点小数点位数。(一般用不到) 功能:在图像img绘制由点pt1到点pt2的直线,其中颜色为color,线宽为thickness。2,绘制长方形
3,绘制椭圆
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, int shift=0 ); 参数1:img,图像。 参数2:center,椭圆圆心坐标。 参数3:axes,轴的长度。 参数4:angle,偏转的角度。 参数5:start_angle,圆弧起始角的角度。. 参数6:end_angle,圆弧终结角的角度。 参数7:color,线条的颜色。 参数8:thickness,线条的粗细程度。 参数9:line_type,线条的类型。 参数10:shift,圆心坐标点和数轴的精度。 功能:函数cvEllipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形。圆弧被ROI矩形所忽略。反走样弧线和粗弧线使用线性分段近似值。所有的角都是以角度的形式给定的。4,绘制圆
void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int line_type=8, int shift=0 ); 参数1:img,图像。 参数2:center,圆心坐标。 参数3:radius,圆形的半径。 参数4:color,线条的颜色。 参数5:thickness,如果是正数,表示组成圆的线条的粗细程度。否则,若为负数,表示圆是否被填充。 参数6:line_type,线条的类型。 参数7:shift,圆心坐标点和半径值的小数点位数。(一般用不到) 功能:函数cvCircle绘制或填充一个给定圆心和半径的圆。圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r, g, b ),或者Scalar( r, g, b )。5,填充多边形
6,绘制文字
void cv::putText(cv::Mat& img, const string& text, cv::Point origin, int fontFace, double fontScale, cv::Scalar color, int thickness = 1, int lineType = 8, bool bottomLeftOrigin = false); 参数1:img, 待绘制的图像 参数2: text, 待绘制的文字 参数3:origin, 文本框的左下角 参数4:fontFace, 字体 (如cv::FONT_HERSHEY_PLAIN) 参数5: fontScale, 尺寸因子,值越大文字越大 参数6: color, 线条的颜色(RGB) 参数7:thickness,线条宽度 参数8:lineType,线型 参数9:当为true时文字处于文本框左下角,否则处于左上角1,绘制直线
2,绘制长方形 3,绘制椭圆 4,绘制圆 5,填充多边形 6,绘制文字 7,整体显示效果8,绘制随机线(自定义函数)
#include#include using namespace std;using namespace cv;const char* drawdemo_win = "draw shapes and text demo";//定义一个窗口名void Mylines(Mat &bgImage);//自定义函数(里面需传递图像变量)void MyRectangle(Mat &bgImage);void MyEllipse(Mat &bgImage);void MyCircle(Mat &bgImage);void MyPolygon(Mat &bgImage);void RandomLineDemo(Mat &bgImage);int main(){ Mat bgImage = imread("1.jpg"); if (bgImage.empty()){ cout << "image could not load ..." << endl; getchar(); return -1; } Mylines(bgImage); MyRectangle(bgImage); MyEllipse(bgImage); MyCircle(bgImage); MyPolygon(bgImage); putText(bgImage, "Hello OpenCV", Point(300, 300), CV_FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 23, 200), 3, 8);//打印文字 imshow(drawdemo_win, bgImage); //RandomLineDemo(bgImage); waitKey(0); return 0;}void Mylines(Mat &bgImage){ Point p1 = Point(20, 30); Point p2; p2.x = 300; p2.y = 300; Scalar color = Scalar(0, 0, 255);//定义一个颜色为红色 line(bgImage, p1, p2, color, 1, LINE_8);//在图像bgImage上画一条由p1到p2点的线 //line(bgImage, p1, p2, color, 1, LINE_AA);//采用反锯齿,效果比较好,但效率略低}void MyRectangle(Mat &bgImage){ Rect rect = Rect(300, 50, 300, 300); Scalar color = Scalar(255, 0, 0); rectangle(bgImage, rect, color, 2, LINE_8);}//绘制椭圆void MyEllipse(Mat &bgImage) { Scalar color = Scalar(0, 255, 0); ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 360, color, 2, LINE_8);//Point椭圆中心,Size表示长轴、短轴 //ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 180, color, 2, LINE_8);//此处只绘制一半的弧度}void MyCircle(Mat &bgImage) { Scalar color = Scalar(0, 255, 255); Point center = Point(bgImage.cols / 2, bgImage.rows / 2); circle(bgImage, center, 150, color, 2, 8);}//填充多边形void MyPolygon(Mat &bgImage) { 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(150, 150); const Point* ppts[] = { pts[0] }; int npt[] = { 5 }; Scalar color = Scalar(255, 12, 255); fillPoly(bgImage, ppts, npt, 1,color,8);}//画随机线void RandomLineDemo(Mat &bgImage) { RNG rng(12345);//定义一个随机数 Point pt1; Point pt2; Mat bg = Mat::zeros(bgImage.size(), bgImage.type());//创建一个空白图像 namedWindow("random line demo", CV_WINDOW_AUTOSIZE); for (int i = 0; i < 100000; i++) { pt1.x = rng.uniform(0, bgImage.cols);//随机数在image图像内生成(不能超过边缘) pt2.x = rng.uniform(0, bgImage.cols); pt1.y = rng.uniform(0, bgImage.rows); pt2.y = rng.uniform(0, bgImage.rows); Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); if (waitKey(50) > 0) { //在50ms后跳出循环 break; } line(bg, pt1, pt2, color, 1, 8); imshow("random line demo", bg); }}
转载地址:http://tzozi.baihongyu.com/