一、介绍OpenCV中三个绘图函数:
circle() 、ellipse() 、rectangle()
二、函数的应用实例,利用这些函数分别绘制了
丰田车标、
奥迪车标以及
红十字,并附上代码。
1.Circle
绘制圆形。
void cvCircle( CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int line_type=8, int shift=0 );
img
图像。
center
圆心坐标。
radius
圆形的半径。
color
线条的颜色。
thickness
如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充。
line_type
线条的类型。见 cvLine 的描述
shift
圆心坐标点和半径值的小数点位数。
函数cvCircle绘制或填充一个给定圆心和半径的圆。圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r, g, b )。
*************************************
代码
********************
- #include<opencv2/core/core.hpp> //包含程序所使用的头文件和命名空间
- #include<opencv2/highgui/highgui.hpp>
- #include "opencv2/imgproc/imgproc.hpp"
- using namespace cv;
- #define Win_Name2 "Audi 奥迪"
- int main(int argc, char** argv)
- {
- //绘制奥迪Audi车标
- Mat image2 = Mat::zeros(600, 850, CV_8UC3);//生成一个850x600的窗口
- circle(image2, Point(200, 300), 100, Scalar(225, 0, 225), 7, 8);//绘制第一个圆,半径为100,圆心(200,300),颜色为紫色
- circle(image2, Point(350, 300), 100, Scalar(225, 0, 225), 7, 8);//绘制第一个圆,半径为100,圆心(350,300),线宽为7
- circle(image2, Point(500, 300), 100, Scalar(225, 0, 225), 7, 8);//绘制第一个圆,半径为100,圆心(500,300)
- circle(image2, Point(650, 300), 100, Scalar(225, 0, 225), 7, 8);//绘制第一个圆,半径为100,圆心(650,300)
- imshow(Win_Name2, image2);
- waitKey();
- return 0;
- }
2.Ellipse绘制椭圆圆弧和椭圆扇形。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 );img图像。center椭圆圆心坐标。axes轴的长度。angle偏转的角度。start_angle圆弧起始角的角度。.end_angle圆弧终结角的角度。color线条的颜色。thickness线条的粗细程度。line_type线条的类型,见CVLINE的描述。shift圆心坐标点和数轴的精度。函数cvEllipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形。圆弧被ROI矩形所忽略。反走样弧线和粗弧线使用线性分段近似值。所有的角都是以角度的形式给定的。3.Rectangle绘制简单、指定粗细或者带填充的 矩形void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 );img图像.pt1矩形的一个顶点。pt2矩形对角线上的另一个顶点color线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。thickness组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。line_type线条的类型。见cvLine的描述shift坐标点的小数点位数。函数 cvRectangle 通过对角线上的两个顶点绘制矩形。
opencv中split函数和merge函数是一对互逆的操作,split可以把一幅图像各个通道分离开,经过对各个通道单独操作后可以用merge函数合并。若要显示单独一个通道的值要把另外两个通道清0再合并,再显示出单通道图片。
split 函数:
- C++: void split(const Mat& src, Mat*mvbegin);
- C++: void split(InputArray m,OutputArrayOfArrays mv);
第一个参数为要进行分离的图像矩阵,第二个参数可以是Mat数组的首地址,或者一个vector<Mat>对象;
merge函数:
- C++: void merge(const Mat* mv, size_tcount, OutputArray dst)
- C++: void merge(InputArrayOfArrays mv,OutputArray dst)
第一种:
第一个参数是图像矩阵数组,第二个参数是需要合并矩阵的个数,第三个参数是输出。
第二种:
第一个参数是图像矩阵向量容器,第二个参数是输出,这种方法无需说明需要合并的矩阵个数,vector对象自带说明
opencv的resize( )函数
int main(){
Mat src = imread("test.jpg");//载入原始图
Mat src1, src2, src3, src4,dst;
src1 = src;//将原始图赋给临时变量
src2 = src;//将原始图赋给临时变量
namedWindow("效果图窗口", 1);//定义窗口
//进行尺寸调整操作
resize(src, src1, Size(src1.cols / 2, src1.rows / 2), (0, 0), (0, 0), 3);
resize(src, src2, Size(src2.cols * 2, src2.rows * 2), (0, 0), (0, 0), 3);
//
//Mat dst=Mat::zeros(512 ,512, CV_8UC3 );//新建一张512x512尺寸的图片
//Mat src=imread(“1.jpg”);
//显式指定dsize=dst.size(),那么fx和fy会其计算出来,不用额外指定。
//resize(src, dst, dst.size());
imshow("效果图窗口", src1);
waitKey(3000);
imshow("效果图窗口", src2);
waitKey(3000);
return 0;
}
C++: void resize(InputArray src,OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
- 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
- 第二个参数,OutputArray类型的dst,输出图像,当其非零时,有着dsize(第三个参数)的尺寸,或者由src.size()计算出来。
- 第三个参数,Size类型的dsize,输出图像的大小;如果它等于零,由下式进行计算:
其中,dsize,fx,fy都不能为0。
- 第四个参数,double类型的fx,沿水平轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:
- 第五个参数,double类型的fy,沿垂直轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:
- 第六个参数,int类型的interpolation,用于指定插值方式,默认为INTER_LINEAR(线性插值)。
可选的插值方式如下:
- INTER_NEAREST - 最近邻插值
- INTER_LINEAR - 线性插值(默认值)
- INTER_AREA - 区域插值(利用像素区域关系的重采样插值)
- INTER_CUBIC –三次样条插值(超过4×4像素邻域内的双三次插值)
- INTER_LANCZOS4 -Lanczos插值(超过8×8像素邻域的Lanczos插值)
若要缩小图像,一般情况下最好用CV_INTER_AREA来插值,
而若要放大图像,一般情况下最好用CV_INTER_CUBIC(效率不高,慢,不推荐使用)或CV_INTER_LINEAR(效率较高,速度较快,推荐使用)。
cv::cvtColor()用于将图像从一个颜色空间转换到另一个颜色空间的转换(
目前常见的颜色空间均支持
),并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。
具体调用形式如下:
- void cv::cvtColor(
- cv::InputArray src, // 输入序列
- cv::OutputArray dst, // 输出序列
- int code, // 颜色映射码
- int dstCn = 0 // 输出的通道数 (0='automatic')
- );
其中,最后一个参数dstCn用于指定目标图像的通道数,如果指定的值是默认值0,那么通道数将由输入图像和颜色转换码决定。
cv::cvtColor()支持多种颜色空间之间的转换,其支持的转换类型和转换码如下:
1、RGB和BGR(
opencv默认的彩色图像的颜色空间是BGR
)颜色空间的转换
cv::COLOR_BGR2RGB
cv::COLOR_RGB2BGR
cv::COLOR_RGBA2BGRA
cv::COLOR_BGRA2RGBA
2、向RGB和BGR图像中增添alpha通道
cv::COLOR_RGB2RGBA
cv::COLOR_BGR2BGRA
3、从RGB和BGR图像中去除alpha通道
cv::COLOR_RGBA2RGB
cv::COLOR_BGRA2BGR
4、从RBG和BGR颜色空间转换到灰度空间
cv::COLOR_RGB2GRAY
cv::COLOR_BGR2GRAY
cv::COLOR_RGBA2GRAY
cv::COLOR_BGRA2GRAY
5、从灰度空间转换到RGB和BGR颜色空间
cv::COLOR_GRAY2RGB
cv::COLOR_GRAY2BGR
cv::COLOR_GRAY2RGBA
cv::COLOR_GRAY2BGRA
6、RGB和BGR颜色空间与BGR565颜色空间之间的转换
cv::COLOR_RGB2BGR565
cv::COLOR_BGR2BGR565
cv::COLOR_BGR5652RGB
cv::COLOR_BGR5652BGR
cv::COLOR_RGBA2BGR565
cv::COLOR_BGRA2BGR565
cv::COLOR_BGR5652RGBA
cv::COLOR_BGR5652BGRA
7、灰度空间域BGR565之间的转换
cv::COLOR_GRAY2BGR555
cv::COLOR_BGR5552GRAY
8、RGB和BGR颜色空间与CIE XYZ之间的转换
cv::COLOR_RGB2XYZ
cv::COLOR_BGR2XYZ
cv::COLOR_XYZ2RGB
cv::COLOR_XYZ2BGR
9、RGB和BGR颜色空间与uma色度(YCrCb空间)之间的转换
cv::COLOR_RGB2YCrCb
cv::COLOR_BGR2YCrCb
cv::COLOR_YCrCb2RGB
cv::COLOR_YCrCb2BGR
10、RGB和BGR颜色空间与HSV颜色空间之间的相互转换
cv::COLOR_RGB2HSV
cv::COLOR_BGR2HSV
cv::COLOR_HSV2RGB
cv::COLOR_HSV2BGR
11、RGB和BGR颜色空间与HLS颜色空间之间的相互转换
cv::COLOR_RGB2HLS
cv::COLOR_BGR2HLS
cv::COLOR_HLS2RGB
cv::COLOR_HLS2BGR
12、RGB和BGR颜色空间与CIE Lab颜色空间之间的相互转换
cv::COLOR_RGB2Lab
cv::COLOR_BGR2Lab
cv::COLOR_Lab2RGB
cv::COLOR_Lab2BGR
13、RGB和BGR颜色空间与CIE Luv颜色空间之间的相互转换
cv::COLOR_RGB2Luv
cv::COLOR_BGR2Luv
cv::COLOR_Luv2RGB
cv::COLOR_Luv2BGR
14、Bayer格式(raw data)向RGB或BGR颜色空间的转换
cv::COLOR_BayerBG2RGB
cv::COLOR_BayerGB2RGB
cv::COLOR_BayerRG2RGB
cv::COLOR_BayerGR2RGB
cv::COLOR_BayerBG2BGR
cv::COLOR_BayerGB2BGR
cv::COLOR_BayerRG2BGR
cv::COLOR_BayerGR2BGR