cmakelists:
cmake_minimum_required(VERSION 3.7)
project(useMat)
set(CMAKE_CXX_STANDARD 11)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_DIRS})
set(SOURCE_FILES main.cpp)
add_executable(useMat ${SOURCE_FILES})
target_link_libraries(useMat ${OpenCV_LIBS})
程序:
#include <iostream>
//#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
//using namespace cv;
int main(int argc, char** argv)
{
cv::Mat_<double> k_1(2, 2);
k_1<<1,2,3,4;
cout<<"k_1=\n"<<k_1<<endl;
cv::Mat k1;
k1=k_1;//这里证明k_1和k1是可以相互赋值的
cout<<"k1=\n"<<k1<<endl;
//此格式常用于矩阵各元素分别赋值,一般用在相机内参矩阵K的赋值上
cv::Mat k2 = (cv::Mat_<double>(2, 2)<<1, 2, 3, 4);//这句在clion上会划红线提示有错误:Types 'Mat' and 'int' are not compatable。后面运行起来貌似没问题。
cout<<"k2=\n"<<k2<<endl;
//imwrite函数生成一张图片文件
cv::Mat mat(48, 64, CV_8UC3);
cv::randu(mat, cv::Scalar::all(0), cv::Scalar::all(255));
cv::imwrite("image.png", mat);
//读入一张图片并在窗口显示,注意这里仅是显示,而不是生成图片文件。
cv::Mat image = cv::imread("ubuntu.png");
cv::imshow("image", image);
cv::waitKey(0);//这里注意,每一个imshow后面必须接一个waitKey,不然不显示窗口,有点类似于终端显示秒关
//输出图片的各像素数值信息,这里有许多中格式,通过format()第二个参数设定,python格式看起来比较顺眼
cout<<format(mat, cv::Formatter::FMT_PYTHON)<<endl;
//颜色空间转换,通过cvtColor()进行,原始图,转换图,转换标示符,通过各种标识符来控制颜色输出,下方将彩色图转换成黑白图
//通过下面的输出可以看出,通道数并没有改变,只是将RGB三个通道的值都变成一样的了,所以变成了黑白图。
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_RGB2GRAY);
cout<<cv::format(image, cv::Formatter::FMT_PYTHON)<<endl;
cv::imshow("黑白图像", gray);
cv::waitKey(0);
//~~~~~~~~~~~~~基本图形绘制~~~~~~~~~~~~~~~
//绘制椭圆ellipse(),下为函数定义
/*
CV_EXPORTS_W void ellipse(InputOutputArray img, Point center, Size axes,
double angle, double startAngle, double endAngle,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);
*/
//这里注意,单纯的cv::Mat image;是创建不出来任何图像的,所以imshow()也会报错,必须用zeros函数创建一张黑色底片,规定好大小,通道数,才能创建出一张可以显示图片。
cv::Mat image_ellipse = cv::Mat::zeros(600, 600, CV_8UC3);
// 各参数为:椭圆中心点位置坐标(这里是图片中的像素坐标)、
// 绘制区域矩形的长宽(如果Size中的参数相等就是圆,不相等就是椭圆。注意Size中的参数值是指半轴长,也就是像下面设成Size(300, 300)这个圆会跟上方600*600的image一样大)、
// 旋转角度(也就是底板矩形的旋转)、
// 椭线开始的角度、椭线结束的角度(这两个参数是设置椭圆要不要画全,还是画一部分,定义的是从3点钟为0°,顺时针转为正,比如下面的0, 270。画出来就是G这种轮廓)、
// 线的颜色,Scalar(255, 129, 0)为蓝色
// 函数原型中后面还有线宽、线型等设置,但都有默认值,所以没有写。
cv::ellipse(image_ellipse, cv::Point(300, 300), cv::Size(300, 300), 0, 0, 270, cv::Scalar(255, 129, 0));
cv::imshow("ellipse", image_ellipse);
cv::waitKey(0);
//绘制圆的circle(),函数定义:
/*
CV_EXPORTS_W void circle(InputOutputArray img, Point center, int radius,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);
*/
//跟上方一样,定义一张黑板底片
cv::Mat image_circle = cv::Mat::zeros(600, 600, CV_8UC3);
//参数:
//要绘制的图片
//圆中心点
//半径
//颜色
//这里没有跟椭圆一样有起始点和终止点位置,也就以为着只要画了就必须是个整圆,没有缺角。也就意味着想要画缺角的圆或者椭圆必须用ellopse()函数。
cv::circle(image_circle, cv::Point(300, 300), 300, cv::Scalar(0, 0, 255));
cv::imshow("circle", image_circle);
cv::waitKey(0);
//画线line()
//函数定义:
/* CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
int thickness = 1, int lineType = LINE_8, int shift = 0);*/
//跟上方一样,定义一张黑板底片
cv::Mat image_line = cv::Mat::zeros(600, 600, CV_8UC3);
//参数比较简单,图像,起始点,终止点,颜色,后面的额线宽,线型等都有默认值
cv::line(image_line, cv::Point(200, 200), cv::Point(400, 400), cv::Scalar(0, 0, 255));
cv::imshow("line", image_line);
cv::waitKey(0);
//绘制矩形,函数定义:
/* CV_EXPORTS_W void rectangle(InputOutputArray img, Point pt1, Point pt2,
const Scalar& color, int thickness = 1,
int lineType = LINE_8, int shift = 0);*/
//跟上方一样,定义一张黑板底片
cv::Mat image_rectangle = cv::Mat::zeros(600, 600, CV_8UC3);
//参数:图片,左上角点,右下角点,颜色,后面的有默认值
cv::rectangle(image_rectangle, cv::Point(100, 100), cv::Point(200, 200), cv::Scalar(0, 0, 255));
cv::imshow("rectangle", image_rectangle);
cv::waitKey(0);
return 0;
}