• opencv学习之路(5)、鼠标和滑动条操作


    一、鼠标事件

     1 #include<opencv2/opencv.hpp>
     2 #include<iostream>
     3 using namespace cv;
     4 using namespace std;
     5 
     6 Mat img(500,500,CV_8UC3,Scalar(255,255,255));//定义成全局变量
     7 
     8 void OnMouse(int event,int x,int y,int flags,void* param){
     9     if(event==CV_EVENT_LBUTTONDOWN){//如果鼠标左键按下
    10         cout<<"mouse down"<<endl;//控制台输出
    11         circle(img,Point(x,y),80,Scalar(255,255,0),2,8);//在全局变量img上画圆
    12     }
    13 }
    14 
    15 void main(){
    16     namedWindow("mouse",CV_WINDOW_AUTOSIZE);
    17     setMouseCallback("mouse",OnMouse,0);
    18     while(1){
    19         imshow("mouse",img);
    20         if(27==waitKey(10))//每隔10毫秒检测是否按下esc键
    21             break;
    22     }
    23 }

    另外一种方法,不必将img图像设置为全局变量,只需传入其地址即可。

     1 #include<opencv2/opencv.hpp>
     2 #include<iostream>
     3 using namespace cv;
     4 using namespace std;
     5 
     6 Point pt;
     7 void OnMouse(int event,int x,int y,int flags,void* param){
     8     Mat img=*(Mat*)param;//将param强制转换为Mat指针,*(Mat*)=Mat,就如*(int*)=int一样
     9     switch(event){
    10         case CV_EVENT_LBUTTONDOWN://鼠标左键按下时
    11             pt.x=x;
    12             pt.y=y;
    13             break;
    14         case CV_EVENT_LBUTTONUP://鼠标左键抬起时
    15             rectangle(img,pt,Point(x,y),Scalar(0,255,0),2,8);
    16             break;
    17         default:
    18             break;
    19     }
    20 }
    21 
    22 void main(){
    23     Mat img(500,500,CV_8UC3,Scalar(255,255,255));
    24     namedWindow("mouse",CV_WINDOW_AUTOSIZE);
    25     setMouseCallback("mouse",OnMouse,&img);//传入img的地址,这样就不必将img设置成全局变量了
    26 
    27     while(1){
    28         imshow("mouse",img);
    29         if(27==waitKey(10))//每隔10毫秒检测是否按下esc键
    30             break;
    31     }
    32 }

    二、滑动条操作

     1 #include<opencv2/opencv.hpp>
     2 #include<iostream>
     3 using namespace cv;
     4 using namespace std;
     5 
     6 Mat dst;
     7 int value=20;
     8 
     9 void onChange(int,void* param){
    10     Mat src=*(Mat*)param;
    11     threshold(src,dst,value,255,THRESH_BINARY);//二值化
    12     //Canny(src,dst,value,255);//canny边缘检测
    13     imshow("TrackBar",dst);
    14 }
    15 
    16 void main(){
    17     Mat src=imread("1.jpg",0);//读入灰度图
    18     namedWindow("TrackBar",CV_WINDOW_AUTOSIZE);
    19     createTrackbar("Threshold","TrackBar",&value,255,onChange,&src);
    20 
    21     threshold(src,dst,value,255,THRESH_BINARY);
    22     //Canny(src,dst,value,255);
    23     imshow("TrackBar",dst);//  21/22/23这三行代码如果去掉的话,在未调整滑动条的情况下,不会有画面显示
    24 
    25     waitKey(0);
    26 }

  • 相关阅读:
    Magical系列软件产品项目启动了
    IT从业者的学习规划 学习者系列文章开篇
    软件项目角色指南开篇
    使用CSS定位页面的“footer”
    项目管理知识体系指南【3】项目生命期与组织
    读书感受 软件设计师 你必须知道的.NET (C#类型存储方式分析)
    软件外包及其项目管理分析
    项目管理知识体系指南【1】开篇
    项目管理知识体系指南【4】单个项目管理过程
    软件设计师之路【1】开篇
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7172229.html
Copyright © 2020-2023  润新知