一.相关API:
Mat imread(const string& file,int flags=1)
功能:加载图像
参数1:需要载入图像的路径名
参数2:指定加载图像的颜色和类型
flags>0 返回三通道彩色图像
flags=0 返回灰度图像
flags<0 返回包含alpha通道的加载图像
返回值:Mat类型数据
void imshow(const string winname,InputArray mat)
功能:显示图像
参数1:要显示到的窗口的名称
参数2:要显示的图像
void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE)
功能:创建一个窗口
参数1:窗口名称
参数2:窗口标识:WINDOW_AUTOSIZE ,不可更改窗口大小,WINDOW_NORMAL,可手动更改窗口大小,WINDOW_OPENGL支持OPENGL功能
destroyWindow()/destroyALLWINDOWS()
功能:销毁之前分配窗口的内存空间
bool imwrite(const string& filename,InputArray img,const vector< int > &=paramsvector< int >())
功能:输出图像到文件
参数1:写入的文件路径和后缀名
参数2:Mat类图像数据
参数3:与保存图片的后缀名类型有关,可不填
Range(int start ,int end)
功能:选出start到end(不包含end的行或列),常用来提取图像的某一个部位
Rect(int x, int y, int width, int height)
功能:选出一块矩形区域
参数:xy表示图像的某一点坐标,width表示绘制矩形的宽,height表示绘制矩形的高
AddWeighted( const CvArr * src1, double alpha,const CvArr * src2, double beta,double gamma, CvArr* dst )
功能 :图像混合
参数1:输入图像1
参数2:输入图像1的权重
参数3:输入图像2
参数4:输入图像2的权重
参数5:合成图像的偏置,即合成图像每个像素需另加的值
参数6:输出的合成图
createTrackbar()
功能:创建一个滑动条
参数1:const string& trackbarname //滑动条的名称
参数2:const string& winname//滑动条所在窗口名称
参数3:int * value//滑动条的初始位置
参数4:int count//滑块的行程(最大刻度)
参数5:TrackbarCallBack(int * ,void *)//回调函数,当滑动条滑动时,调用该函数
参数6 void 类型//用户传给回调函数的一些参数 ,如果第三个参数是全局的,可以不用该参数
int getTrackbarPos()
功能:获取窗口滑动条的位置
参数1:const string &trackbarname 滑动块的名称
参数2:const string &winname 滑动块的父窗口句柄
SetMouseCallback()
功能:鼠标操作
参数1:const string& winname窗口名称
参数2:MouseCallback OnMouse鼠标处理函数
参数3:void* userdata 用户传入鼠标处理函数的调用参数
OnMouse(int event,int x,int y,int flags,void* param)
参数1:出发鼠标的消息(宏),鼠标抬起,按下等
参数2:窗口鼠标当前的x坐标
参数3:窗口鼠标当前的y坐标
参数4:按下ctrl,shift等组合键的标志(宏)
参数5:即userdata
二.程序实例
程序1
#include<opencv2/opencv.hpp>
#include<iostream>
using namesapce std;
using namespace cv;
void CreateAlphaMat(Mat& mat)
{
for (int i = 0; i < mat.rows; i++)
{
for (int j = 0; j < mat.cols; j++)
{
Vec4b& rgba = mat.at<Vec4b>(i, j);
rgba[0] = UCHAR_MAX;
rgba[1] = saturate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX);
rgba[2] = saturate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX);
rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
}
}
}
int main()
{
Mat mat(400, 400, CV_8UC4);
CreateAlphaMat(mat);
imshow("rbga", mat);
imwrite("C:\\Users\\Pictures\\Camera Roll\\rgba.png", mat);
waitKey();
return 0;
}
程序2
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "【程序窗口】"
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(Mat& img, Rect box);
void ShowHelpText();
Rect g_rectangle;
bool g_bDrawingBox = false;
RNG g_rng(time(NULL));
int main()
{
g_rectangle = Rect(-1, -1, 0, 0);
Mat srcImage(600, 800, CV_8UC3), tempImage;
srcImage = Scalar::all(0);
srcImage.copyTo(tempImage);
namedWindow(WINDOW_NAME);
setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);
ShowHelpText();
while (1)
{
srcImage.copyTo(tempImage);
if (g_bDrawingBox)
DrawRectangle(tempImage, g_rectangle);
imshow(WINDOW_NAME, tempImage);
if (waitKey(10) == 27)
break;
}
return 0;
}
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
Mat& image = *((Mat*)param);
switch (event)
{
case EVENT_MOUSEMOVE:
{
if (g_bDrawingBox)
{
g_rectangle.width = x - g_rectangle.x;
g_rectangle.height = y - g_rectangle.y;
}
}
break;
case EVENT_LBUTTONDOWN:
{
g_bDrawingBox = true;
g_rectangle = Rect(x, y, 0, 0);
}
break;
case EVENT_LBUTTONUP:
{
g_bDrawingBox = false;
if (g_rectangle.width < 0)
{
g_rectangle.x += g_rectangle.width;
g_rectangle.width *= -1;
}
if (g_rectangle.height < 0)
{
g_rectangle.y += g_rectangle.height;
g_rectangle.height *= -1;
}
//if(flags== CV_EVENT_FLAG_CTRLKEY)
DrawRectangle(image, g_rectangle);
}
default:
break;
}
}
void DrawRectangle(Mat& img, Rect box)
{
//box.tl()是左上顶点, box.br()是右下顶点
rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}
void ShowHelpText()
{
printf("按下鼠标左键开始绘制矩形\n松开鼠标左键停止绘制\n");
}