1、加载、修改、保存图像
(1)加载图像是什么:
Mat src = cv::imread(“D:2222.jpg”);
imread的功能是加载图像文件成为一个Mat对象,第一个参数表示图像的存储路径,第二个参数表示加载的图像是什么类型;
IMREAD_UNCHANGED(<0)表示加载原图,不做任何修改;
IMREAD_GRAYSCALE(=0)表示把原图作为灰度图像加载进来;
IMREAD_COLOR(>0)表示把原图作为RGB图像加载进来;
OpenCV支持加载jpg、png、tiff等格式图像;
(2)图像显示是什么:
cv::namedWindos和cv::imshow;
namedWindos(“Window Title”, WINDOW_AUTOSIZE);
WINDOW_AUTOSIZE表示根据图像大小显示,不能认为修改图像的尺寸大小;
namedWindos表示创建一个OpenCV窗口,它是由OpenCV自动创建和销毁的,无需手动销毁;
imshow(“Window Title”, src);
imshow是根据窗口名称显示图像到指定窗口中去,第一个参数是窗口名称,第二个参数是Mat对象;
(3)修改图像是什么:
cv::cvtColor
cvtColor(src, des, COLOR_BGR2GRAY);
cvtColor的功能是把图像从一个彩色空间转移到另外一个彩色空间,第一个参数表示源图像,第二个参数表示转移到的目标图像,第三个参数表示转移色彩属性,COLOR_BGR2HLS、COLOR_BGR2GAY等;
(4)保存图像是什么:
cv::imwrite
用于保存图像到指定目录中;
只有8位、16位的JPG、PNG、TIFF格式的图像并且单通道或者三通道的BGR的图像才能通过这种方式保存;
保存PNG格式的时候可以保存透明通道的图片;
可以指定压缩参数;
(5)代码演示:
Mat src, des;
src = imread("D:2222.jpg", IMREAD_UNCHANGED);
if(src.empty())
{
cout << "could not read image\n" << endl;
return -1;
}
nameWindos("Input image", WINDOW_AUTOSIZE);
imshow("Input image", src);
cvtColor(src, des, COLOR_BGR2HLS);
imwrite("D:1234.png", src);
waitKey(0);
5、如何获取图像的像素指针:
获取当前行指针:const uchar* current = myImage.prt(row);
row表示第几行;
获取当前像素点p(row, col)的像素值p(row, col) = current[col];
6、图像像素范围处理saturate_cast
saturate_cast(-100),返回0
saturate_cast(288),返回255
saturate_cast(100),返回100
该函数的功能是确保RGB值范围是在0-255;
7、掩膜操作是什么:
根据掩膜来重新计算每个像素的像素值,掩膜mask也被称为Kernel;
通过掩膜操作来提高图像的对比度;
演示代码:
Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst, src.depth(), kernel);
nameWindos(“Input image”, WINDOW_AUTOSIZE);
imshow(“Input image”, src);
waitKey(0);
8、Mat对象是什么:
Mat对象是OpenCV2.0之后引入的图像数据结构、自动分配内存、不存在内存泄漏的问题、是面向对象的数据结构,分为头部和数据两部分;
9、Mat对象的构造函数和常用方法是什么:
Mat(); Mat(int rows, int cols, int type); Mat(Size size, int type);
void copyTo(Mat mat) 将当前Mat对象复制到另外一个对象
void convertTo(Mat dst, int type)
Mat clone() 将当前Mat对象克隆给另外一个对象
int channels() 当前对象通道数
int depth() 当前对象的深度
bool empty(); 当前对象图像数据是否为空
uchar* ptr(i=0) 当前对象像素指针
Mat creat(src.size(), src.type()); 创建一个和src对象大小和类型一样的对象
5、图像混合
(1)相关API:
参数1:输入图像Mat-src1
参数2:输入图像src1的alpha值
参数3:输入图像Mat-src2
参数4:输入图像src2的alpha值
参数5:gamma值
参数6:输出混合图像
注:两张图像的大小和类型必须一致才可以
(2)示例代码:
Mat src1, src2, dest;
src1 = imread("D:/vcprojects/images/LinuxLogo.jpg");
src2 = imread("D:/vcprojects/images/win7logo.jpg");
if (!src1.data)
{
printf("could not load LinuxLogo image...\n");
return -1;
}
if (!src2.data)
{
printf("could not load win7logo image...\n");
return -1;
}
if (src1.rows == src2.rows && src1.cols == src2.cols)
{
double alpha = 0.5;
namedWindow("line-blend", CV_WINDOW_AUTOSIZE);
addWeighted(src1, (1 - alpha), src2, alpha, 0.0, dest);
imshow("line-blend", dest);
waitKey(0);
return 0;
}
else
{
printf("image size is not same...\n");
return -1;
}
第六课、绘制形状和文字
(1)相关API cv::Point cv::Scalar
Point表示2D平面上一个点x,y
Point p;
p.x = 10;
p.y = 8;
p = Point(10, 8);
Scalar表示四个元素的向量
Scalar(a, b, c); //a = blue, b = green, c = red表示RGB三个通道
(2)如何绘制线、矩形、圆、椭圆等基本几何形状
画线 cv::line (LINE_4\LINE_8\LINE_AA)
画椭圆 cv::elipse
画矩形 cv::rectangle
画圆 cv::circle
画填充 cv::fillPoly
(3)如何生成随机数
cv::RNG
生成高斯随机数gaussian(double sigma)
生成正态分布随机数uniform(int a, int b)
(4)如何添加文字
putText函数中设置fontFace(cv::HersheyFonts)
-fontFace, CV_FONT_HERSHEY_PLAIN
-fontScale, 1.0, 2.0~8.0
7、代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat bgImage;
const char* drawdemo_win = "draw shapes and text demo";
void MyLines(); //画线
void MyRectangle(); //画矩形
void MyEllipse(); //画椭圆
void MyCircle(); //画圆
void MyPolygon(); //画多边形
void RandomLineDemo(); //画自由线
int main(int argc, char** argv) {
bgImage = imread("D:/vcprojects/images/test1.png");
if (!bgImage.data) {
printf("could not load image...\n");
return -1;
}
MyLines();
MyRectangle()</