RV1126 NO.44:OPENCV的cvtColor和putText的讲解
一.cvtColor的用处和API讲解
1.1 cvtColor函数简介
cvtColor是OpenCV中用于图像颜色空间转换的核心函数,支持多种颜色模式间的相互转换。该函数能够实现包括RGB转灰度图、灰度图转RGB、RGB转HSV等多种常见颜色空间转换。
1.2 cvtColor函数API
CV_EXPORTS_W void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
参数说明:
- src:输入图像数据
- dst:输出图像数据
- code:颜色空间转换标识符
- dstCn:目标图像通道数,默认为0
支持11大类颜色空间转换:
- RGB↔BGR
- RGB→5X5
- RGB↔GRAY
- RGB↔CIEXYZ
- RGB↔YCrCb(YUV)
- RGB↔HSV
- RGB↔HLS
- RGB↔CIELab
- RGB↔CIELuv
- RGB↔Bayer
- YUV420↔RGB

1.3.用代码实现cvtColor的颜色转换功能
这次代码主要是转换几个常见的格式,如RGB->YUV, YUV->RGB。具体的代码思路如下:

这个代码里面我们分别读取两种图片,一种是RGB图片、另外一种是YUV灰度图像、分别用cvtColor把RGB图像转换成YUV图像、把YUV灰度图像转换成RGB图像、最后用imwrite保存两种图片。下面是一些代码的实现:
1.3.1调用imread读取RGB彩色图像
Mat car_image = imread("car.png");if(car_image.empty()){perror("can not find this picture:\n");return -1;}
读取RGB彩色通道的图像,这张图片是一张车辆的图片
1.3.2.把RGB图像转换为YUV图像
Mat yuv_procss_car_image;cvtColor(car_image,yuv_procss_car_image,COLOR_RGB2YUV);
调用cvtColor把三通道的RGB图像转换为YUV的灰度图像,这里使用的是COLOR_RGB2YUV。
1.3.3.调用imread读取YUV灰度图像
Mat yuv_car_image = imread("yuv_car.png");if(car_image.empty()){perror("can not find this picture:\n");return -1;}
读取YUV的灰度图像,这张图片是一张灰度的汽车图像
1.3.4.把YUV图像转换为RGB图像
Mat rgb_procss_car_image;cvtColor(car_image,rgb_procss_car_image,COLOR_RGB2YUV);
调用cvtColor把单通道的图像转换成RGB图像,调用的选项使用的是COLOR_YUV2RGB
1.3.5.把处理过后的两种图像保存
imwrite("yuv_procss_car_image.jpg",yuv_procss_car_image);imwrite("rgb_procss_car_image.jpg",rgb_procss_car_image);
完整代码:
#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat car_image = imread("car.png");if(car_image.empty()){perror("can not find this picture:\n");return -1;}Mat yuv_procss_car_image;cvtColor(car_image,yuv_procss_car_image,COLOR_RGB2YUV);Mat yuv_car_image = imread("yuv_car.png");if(car_image.empty()){perror("can not find this picture:\n");return -1;}Mat rgb_procss_car_image;cvtColor(car_image,rgb_procss_car_image,COLOR_RGB2YUV);imwrite("yuv_procss_car_image.jpg",yuv_procss_car_image);imwrite("rgb_procss_car_image.jpg",rgb_procss_car_image);return 0;
}
最终效果:

左边是处理后的YUV图像,右边是RGB图像
二.putText的用处和API讲解
2.1. putText的用法和作用
putText是OPENCV中常见的功能,他主要的功能是在Mat矩阵里面显示显示文字,像下图

从上图可以看出来putText是通过坐标(X,Y)在矩阵显示文字
2.2. putText的API
CV_EXPORTS_W void putText( InputOutputArray img, const String& text, Point org,int fontFace, double fontScale, Scalar color,int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false );
第一个参数:img需要传入的图像数据
第二个参数:text需要显示的文字
第三个参数:org文字在图像数据中的坐标位置
第四个参数:fontFace字体类型,常用的字体类型如下:
FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX,FONT_HERSHEY_COMPLEX,FONT_HERSHEY_TRIPLEX,FONT_HERSHEY_COMPLEX_SMALL,FONT_HERSHEY_SCRIPT_SIMPLEX, orFONT_HERSHEY_SCRIPT_COMPLEX,以上所有类型都可以配合 FONT_HERSHEY_ITALIC使用,产生斜体效果
第五个参数:fontScale字体的大小
第六个参数:color是颜色标量,字体的显示颜色
第七个参数:thickness是字体的粗细程度,默认为1
第八个参数:lineType线性,默认是LINE_8,具体的几个如下:
//! type of line
enum LineTypes {FILLED = -1,LINE_4 = 4, //!< 4-connected lineLINE_8 = 8, //!< 8-connected lineLINE_AA = 16 //!< antialiased line
};
第九个参数:bottomLeftOrigin图像数据原点在左下角, Otherwise(默认false)图像数据中原点的左上角。默认bottomLeftOrigin = false
2.3. 用代码实现putText的功能
2.3.1.读取车辆图片
Mat car_image = imread("car.png");if(car_image.empty()){printf("Can not load car_image.....\n");return -1;}
使用imread读取需要处理的图片
2.3.2.调用putText的API进行文字显示
string str = "HelloWorld";Point bg;bg.x = 0;//坐标的x轴是0bg.y = 400;//坐标的y轴是400int fontFace = cv::FONT_HERSHEY_PLAIN;//PLAIN的格式double fontScale = 4.0;int thickness = 4;//thickness粗细程度是4putText(car_image,str,bg,fontFace,fontScale, Scalar(0,0,255),thickness, LINE_8);imwrite("putText.jpg", car_image);
上面是代码是利用putText对Mat矩阵进行文字显示,显示的字符是HelloWorld,这里的位置我们选择是Point(0,400)这个位置,字体选择FONT_HERSHEY_PLAIN,字体大小是4.0,颜色为红色(Scalar(0,0,255)), 绘制线的粗细程度是4,然后线的类型是LINE_8.
完整代码:
#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat car_image = imread("car.png");if(car_image.empty()){printf("Can not load car_image.....\n");return -1;}string str = "HelloWorld";Point bg;bg.x = 0;//坐标的x轴是0bg.y = 400;//坐标的y轴是400int fontFace = cv::FONT_HERSHEY_PLAIN;//PLAIN的格式double fontScale = 4.0;int thickness = 4;//thickness粗细程度是4putText(car_image,str,bg,fontFace,fontScale, Scalar(0,0,255),thickness, LINE_8);imwrite("putText.jpg", car_image);return 0;
}
2.3.3.最后用imwrite来保存图片,最终的显示效果是

