什麼叫回調函數?
回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
回調函數使用步驟:
(1)、回調函數簽名———在main()函數之前聲明
(2)、定義回調函數———在main()函數之前定義回調函數執行代碼
(3)、註冊回調函數———在main()函數中關聯回調函數與變量。
代碼如下:
#ifndef onMouse_h
#define onMouse_h
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
using namespace std;
//1.回調函數簽名
void onMouse(int event,int x,int y,int flags,void*param);
//2.定義回調函數
void onMouse(int event,int x,int y,int flags,void*param)
{
cv::Mat *im=reinterpret_cast<Mat*>(param);
switch (event) {
case CV_EVENT_LBUTTONDOWN:
std::cout<<"at("<<x<<","<<y<<")value is:"
<<static_cast<int>(im->at<uchar>(cv::Point(x,y)))<<std::endl;
break;
case CV_EVENT_RBUTTONDOWN:
std::cout<<"input(x,y)"<<endl;
std::cout<<"x="<<endl;
cin>>x;
std::cout<<"y="<<endl;
cin>>y;
std::cout<<"at("<<x<<","<<y<<")value is:"
<<static_cast<int>(im->at<uchar>(cv::Point(x,y)))<<std::endl;
break;
}
}
#endif /* onMouse_h */
主函數:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include "onMouse.h"
using namespace cv;
using namespace std;
int main()
{
Mat image=imread("/Users/zhangxiaoyu/Desktop/1.png",0);//538*716
if(image.empty())
{
cout<<"Error!cannot be read...../n";
return -1;
}
cv::setMouseCallback("original image", onMouse,reinterpret_cast<void*>(&image));
cv::namedWindow("original image");
while(1)
{
cv::imshow("original image", image);
waitKey(40);
}
return 0;
}