有關opencv的學習(11)—有關回調函數

       什麼叫回調函數?

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

回調函數使用步驟:

(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;

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章