星期二, 10. 一月 2017 01:44下午
这部分主要是读取并显示图像,并对图像进行基本操作,比如画图和写字,同时添加图片点击事件的操作
代码学习
#include<iostream>
#include<string>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <boost/concept_check.hpp>
using namespace std;
//图片地址
const string imageAddr0 = "/home/ottsion/Documents/2.jpg";
const string imageAddr1 = "/home/ottsion/Pictures/opencvImage/hua.jpg";
/**
* 根据图片信息显示图片
* @param windowName 显示窗口名称
* @param image opcv的图片信息
*/
void showImage(string windowName, cv::Mat image);
/**
* 根据地址,读取图片信息
* @param imageAddr 图片地址
* @param image opcv的图片信息
*/
void readImage(string imageAddr, cv::Mat& image);
/**
* 将图片进行水平或者垂直翻转
* @param image opcv的图片信息
*/
void convertImage(cv::Mat& image);
/**
* 读取时将图片灰度化或者三通道读取
* @param image opcv的图片信息
*/
void getImageByTypes(cv::Mat& image);
/**
* 鼠标点击事件响应
* @param event 整数,表示鼠标触发事件的类型
* @param x 鼠标事件出发时位置(像素坐标显示)
* @param y 鼠标事件出发时位置
* @param flags 表示事件发生时按下了鼠标的哪个键
* @param param 执行任意对象的指针,作为附加参数发送给函数
*/
void onMouse(int event, int x, int y, int flags, void* param);
/**
* 注册回调函数,本函数中将名为windowName的图像窗口与函数onMouse建立关联,同时把显示图像的地址作为附加参数传给函数
* @param windowName 图像窗口名称
* @param image 图像信息
*/
void callBackFunc(string windowName, cv::Mat& image);
/**
* 在图像上绘画和写入文本
* @param windowName 图像窗口名称
* @param image 图像信息
*/
void drawAndWriteOnImage(string windowName, cv::Mat image);
void showImage(string windowName, cv::Mat image)
{
//先定义窗口
cv::namedWindow(windowName);
//显示图片
cv::imshow(windowName, image);
}
void readImage(string imageAddr, cv::Mat& image)
{
//读取图片
image = cv::imread(imageAddr);
if(image.empty())
{
std::cout<<"显示没有图片或者读取错误"<< image.rows <<endl;
}
showImage("origin image", image);
}
void convertImage(cv::Mat& image)
{
//翻转图像
cv::Mat result;
//正数表示水平,0表示垂直,负数表示水平和垂直
cv::flip(image, result, 1);
//就地处理
//cv::flip(image, image, 1);
showImage("convert image", result);
//保存图片
cv::imwrite("output.png", result);
}
void getImageByTypes(cv::Mat& image)
{
/**
* 读入图片将其转为灰度图片
* 这样生成的图像由无符号字节构成,opencv中用定义的常量CV_8U表示
*/
image = cv::imread(imageAddr1, CV_LOAD_IMAGE_GRAYSCALE);
showImage("gray image", image);
/**
* 读入图片将其转为三通道图片
* 这样生成的图像用opencv中用定义的常量CV_8UC3表示
* 如果输入图像为灰度图像,三通道数值相同
* 如果读入时图像选择本身格式,只需将第二个参数设置为负值\
* 如果读入图像由整形(CV_16U,CV_32S)构成,图像每个像素将除以256,以便在256级灰度中显示
* 如果读入图像由浮点数构成,图像每个像素将设置为从0.0到1.0,超出范围的部分显示为白色(大于1.0),黑色(小于0.0)
*/
image = cv::imread(imageAddr1, CV_LOAD_IMAGE_COLOR);
showImage("color image", image);
}
void onMouse(int event, int x, int y, int flags, void* param)
{
cv::Mat *im =reinterpret_cast<cv::Mat*>(param);
switch(event)
{
/*
* CV_EVENT_MOUSEMOVE =0,
* CV_EVENT_LBUTTONDOWN =1,
* CV_EVENT_RBUTTONDOWN =2,
* CV_EVENT_MBUTTONDOWN =3,
* CV_EVENT_LBUTTONUP =4,
* CV_EVENT_RBUTTONUP =5,
* CV_EVENT_MBUTTONUP =6,
* CV_EVENT_LBUTTONDBLCLK =7,
* CV_EVENT_RBUTTONDBLCLK =8,
* CV_EVENT_MBUTTONDBLCLK =9
*/
case CV_EVENT_LBUTTONDOWN:
//第五部分
cout<<"at ("<< x <<", "<< y << ") value is : "<< static_cast<int>(im->at<uchar>(cv::Point(x,y))) <<endl;
//第六部分
//drawAndWriteOnImage("color image", *im);
}
}
void callBackFunc(string windowName, cv::Mat& image)
{
image = cv::imread(imageAddr1, CV_LOAD_IMAGE_GRAYSCALE);
showImage(windowName, image);
cv::setMouseCallback(windowName, onMouse, reinterpret_cast<void*>(&image));
}
void drawAndWriteOnImage(string windowName, cv::Mat image)
{
image = cv::imread(imageAddr1, CV_LOAD_IMAGE_GRAYSCALE);
/* 基本绘图形状函数有circle、ellipse、line、rectangle等等
* CV_EXPORTS_W void circle(CV_IN_OUT Mat& img, Point center, int radius,
* const Scalar& color, int thickness=1,
* int lineType=8, int shift=0);
*/
cv::circle(
image, //目标图像
cv::Point(155,110), //中心点坐标
65, //半径
255, //颜色
3 //厚度
);
//写入文本信息
cv::putText(
image, //目标图像
"This is a text test", //文本内容
cv::Point(40,200), //文本位置
cv::FONT_HERSHEY_PLAIN, //字体类型
2.0, //字体大小
255, //字体颜色
2 //文本厚度
);
showImage(windowName, image);
}
int main(int argc, char **argv)
{
cv::Mat image;
cout<<"this image is "<<image.size<<endl;
cout<<"this image is "<<image.rows<<" x "<<image.cols<<endl;
//第一部分,显示图片
readImage(imageAddr1,image);
cv::waitKey(0); //0表示永远等待,正数表示秒
//第二部分,翻转图像
convertImage(image);
cv::waitKey(0);
//第三部分,读入读出三色变换
getImageByTypes(image);
cv::waitKey(0);
//第四部分,查看图像通道数
std::cout<<"this image has "<<image.channels()<<" channels."<<endl;
//第五部分,回调函数
callBackFunc("origin image", image);
cv::waitKey();
//第六部分,图像上绘图和写文字
drawAndWriteOnImage("draw image", image);
cv::waitKey();
return 0;
}