1.访问矩阵元素的三种方法
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include "highgui/highgui.hpp"
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
cv::Mat mSrcImg = cv::imread(".\\face\\timg3.jpg");
if (mSrcImg.data != NULL) {
imshow("mSrcImg", mSrcImg); waitKey(0);
//方法一 使用uachar *p=image.ptr<uhar> (j)
/*cout << " mSrcImg.rows:" << mSrcImg.rows << endl;
cout << "mSrcImg.cols:" << mSrcImg.cols << endl;
for (int j = 0; j < mSrcImg.rows; j++)
{
uchar *data = mSrcImg.ptr<uchar>(j);
for (int i = 0; i < (mSrcImg.cols*3); i++)
{
data[i] = data[i] + 100;
}
}
imshow("mSrcImg2", mSrcImg); waitKey(0);*/
////方法二 使用迭代器遍历图像
//Mat_<Vec3b>::iterator it = mSrcImg.begin<Vec3b>();
//Mat_<Vec3b>::iterator itend = mSrcImg.end<Vec3b>();
//for(;it!=itend;it++)
//{
// it[0] = (*it)[0]+ 100;
///* it[1] = (*it)[1] + 10;
// it[2] = (*it)[2] + 10;*/
//}
//imshow("mSrcImg2", mSrcImg); waitKey(0);
////方法三 使用at<>访问
for (int i = 0; i < mSrcImg.cols; i++)
{
for (int j = 0; j < mSrcImg.rows; j++)
{
mSrcImg.at<Vec3b>(j, i)[0] = mSrcImg.at<Vec3b>(j, i)[0] + 100;
}
}
imshow("mSrcImg2", mSrcImg); waitKey(0);
}
return 0;
}
知识补充:
:: 的用法
1.类名称::类成员名字
2.全局作用域符号
char zhou; //全局变量
void sleep()
{
char zhou; //局部变量
char(局部变量) = char(局部变量) *char(局部变量) ;
::char(全局变量) =::char(全局变量) *char(局部变量);
}
2.鼠标访问事件
设计思路
全局静态变量 pre_Point ,cur_Point
if(flags==鼠标左键没有按下&&event==鼠标在移动)
{
读取当前的像素,显示在图片上
}
else if(event==鼠标左键按下)
{
记录矩阵左上角坐标,标记这个点
}
else if(event==鼠标移动&&flags==鼠标左键按下)
{
更新cur_Point,画出矩形
}
else if(event==鼠标左键放开)
{
在图像上以pre_Point ,cur_Point截出这个矩形
}
}
实验代码:
#include"stdafx.h"
#include<opencv2/opencv.hpp>
#include<opencv2/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
Mat mSrcImg,mReDraw, mtemp;
void onMouse(int event,int x,int y,int flags, void *ustc)
{
static Point pre_Point(-1, -1);
static Point cur_Point(-1, -1);
char temp[50];
if (event == CV_EVENT_MOUSEMOVE&&flags!=CV_EVENT_FLAG_LBUTTON)
{
mSrcImg.copyTo(mReDraw);
cur_Point=Point(x, y);
sprintf(temp, "(%d,%d)", x,y);
putText(mReDraw, temp, cur_Point, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 0, 0), 1, 8);
imshow("mReDraw", mReDraw);
}
else if (event == CV_EVENT_LBUTTONDOWN)
{
mSrcImg.copyTo(mReDraw);
pre_Point = Point(x, y);
sprintf(temp,"(%d,%d)", x, y);
putText(mReDraw, temp, pre_Point, CV_FRONT, 0.5, Scalar(0, 255, 0), 1, 8);
circle(mReDraw, pre_Point, 3, Scalar(0, 0, 255));
imshow("mReDraw", mReDraw);
}
else if (event == CV_EVENT_MOUSEMOVE&&flags == CV_EVENT_FLAG_LBUTTON)
{
mSrcImg.copyTo(mReDraw);
cur_Point = Point(x, y);
sprintf(temp, "(%d,%d)", x, y);
putText(mReDraw, temp, cur_Point, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 0, 0), 1, 8);
rectangle(mReDraw, Rect(pre_Point, cur_Point), Scalar(0, 255, 255),1, 8);
circle(mReDraw, cur_Point, 3, Scalar(0, 0, 255));
imshow("mReDraw", mReDraw);
}
else if(event==CV_EVENT_LBUTTONUP)
{
mSrcImg.copyTo(mReDraw);
cur_Point = Point(x, y);
sprintf(temp, "(%d,%d)", x, y);
putText(mReDraw, temp, cur_Point, FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 0, 0), 1, 8);
circle(mReDraw, cur_Point, 1, Scalar(0, 0, 255));
imshow("mReDraw", mReDraw);
mSrcImg.copyTo(mtemp);
mtemp = mReDraw(Rect(pre_Point, cur_Point));
imshow("mtemp", mtemp);
waitKey(0);
}
}
int main()
{
mSrcImg = imread(".\\face\\timg3.jpg");
mSrcImg.copyTo(mReDraw);
namedWindow("mReDraw");
setMouseCallback("mReDraw",onMouse,0);
imshow("mReDraw", mReDraw);
waitKey(0);
return 0;
}
opencv 鼠标事件
函数参数介绍:
int event,鼠标操作时间的整数代号,在opencv2.4.5中,event鼠标事件总共有10中,从0-9依次代表如下:
Event:
#define CV_EVENT_MOUSEMOVE 0 滑动
#define CV_EVENT_LBUTTONDOWN 1 左键点击
#define CV_EVENT_RBUTTONDOWN 2 右键点击
#define CV_EVENT_MBUTTONDOWN 3 中间点击
#define CV_EVENT_LBUTTONUP 4 左键释放
#define CV_EVENT_RBUTTONUP 5 右键释放
#define CV_EVENT_MBUTTONUP 6 中间释放
#define CV_EVENT_LBUTTONDBLCLK 7 左键双击
#define CV_EVENT_RBUTTONDBLCLK 8 右键双击
#define CV_EVENT_MBUTTONDBLCLK 9 中间释放
falgs:
#define CV_EVENT_FLAG_LBUTTON 1 左键拖拽
#define CV_EVENT_FLAG_RBUTTON 2 右键拖拽
#define CV_EVENT_FLAG_MBUTTON 4 中间拖拽
#define CV_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件
#define CV_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件
#define CV_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放事件(后面8-39还有待研究)
参考博客: