学习opencv(二刷)前第三章知识点

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还有待研究)  



参考博客:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值