opencv模拟button

简介

  在opencv中并没有专门的button控件,一般可以使用trackbar,设置状态为0、1,来模拟控制触发。不过总感觉这方法有点二,因此尝试了下在opencv中模拟
键值使用。
  同时在实现过程中,使用到了资料:http://www.csdn123.com/html/mycsdn20140110/84/8403a669ceed8e896d5c3ebc45b483b4.html ,非常感谢。

实现流程

具体代码

void ButtonShow(void){
	int i;

	for(i=0; i< buttonNum; i++){
		if(i != 0){
			L_width = buttonAddr[i-1][2] + 30;
		}
		b_seat1=drawButton(img, buttonName[i],Point(L_width, L_height),0);
		buttonAddr[i] = (int *)malloc(4);

		buttonAddr[i][0] = b_seat1.x;
		buttonAddr[i][1] = b_seat1.y;
		buttonAddr[i][2] = b_seat1.width + b_seat1.x;
		buttonAddr[i][3] = b_seat1.height+ b_seat1.y;
	}
}

void on_mouse( int event, int x, int y, int flags, void* ustc)
{
	int buttonNow = -3;
	if(event == CV_EVENT_LBUTTONDOWN){
		tmpAddr[0] = x;
		tmpAddr[1] = y;
		tmpAddr[2] = 0;
		tmpAddr[3] = 0;
	}else if(event == CV_EVENT_LBUTTONUP){
		tmpAddr[2] = x;
		tmpAddr[3] = y;
		buttonNow = choiceButton(tmpAddr, buttonAddr, buttonNum);
		on_button(buttonNow);
	}
}  

int main(int argc,char **argv){
	img=imread(back_name,1);

	ButtonShow();
	imshow(back_show, img);
	cvSetMouseCallback(back_show, on_mouse, NULL);
	waitKey();
}

主体框架

  首先加载一副图片作为背景图,接着将使用ButtonShow将button画在背景图片上,同时将每个button的坐标位置都保存在buttonAddr数组中,接着将
画好button之后的背景图片显示出来,最后给该背景图加上鼠标响应和等待用户操作。
        img=imread(back_name,1);
        ButtonShow();
	imshow(back_show, img);
	cvSetMouseCallback(back_show, on_mouse, NULL);
	waitKey();

鼠标响应

  将用户鼠标左键按下和抬起的坐标都保存在tmpAddr,接着使用函数choiceButton和on_button进行控件的选择和响应。
void on_mouse( int event, int x, int y, int flags, void* ustc){
	int buttonNow = -3;
	if(event == CV_EVENT_LBUTTONDOWN){
		tmpAddr[0] = x;
		tmpAddr[1] = y;
		tmpAddr[2] = 0;
		tmpAddr[3] = 0;
	}else if(event == CV_EVENT_LBUTTONUP){
		tmpAddr[2] = x;
		tmpAddr[3] = y;
		buttonNow = choiceButton(tmpAddr, buttonAddr, buttonNum);
		on_button(buttonNow);
	}
}

控件选择

int choiceButton(int* tmpAddr, int** buttonAddr, int size){
	int i, tmp;

	tmp = abs(tmpAddr[0] - tmpAddr[2]) + abs(tmpAddr[1] - tmpAddr[3]);
	if(tmp > 20){
		return -2;
	}
	for(i=0; i< size; i++){
		if((buttonAddr[i][0] < tmpAddr[0]) && (buttonAddr[i][2] > tmpAddr[0])){
			if((buttonAddr[i][1] < tmpAddr[1]) && (buttonAddr[i][3] > tmpAddr[3])){
				return i;
			}
		}
	}
	return -1;
}

  在鼠标左键抬起的时候调用函数:choiceButton。
       tmpAddr:鼠标左键按下时候的坐标和鼠标左键抬起时候的坐标。
       buttonAddr: 控件的个数和它们的坐标信息。
       size:控件的数量。
  在choiceButton中,1、判断鼠标按下和抬起的坐标是不是在同一个位置,不是的话就直接返回-2。
                      2、判断鼠标左键按下的坐标是不是在控件的范围之类,是的话,就直接返回控件编号。
                      3、如果鼠标左键按下的位置没有在任何一个控件范围内,返回 -1。

控件响应

void on_button(int buttonNow){
	char str[20];
	sprintf(str,"%d", buttonNow);
	Mat img = cv::Mat(300, 300, CV_8UC3, 1);
	imshow(str, img);
}

  根据前面控件选择传回来的参数,对应的用该参数作为空白图片的显示窗口名字,并显示出来。

效果演示

  对应的效果演示截图如下:

  按下控件:cancel,弹出窗口0。
  按下控件:add, 弹出窗口1。
时间: 2024-09-29 03:12:07

opencv模拟button的相关文章

opencv模拟景深效果

简介 在htc的相机应用中发现了一个叫景深的拍照场景,然后练习着用opencv来模拟实现. hcl景深场景效果 本例实现效果 实现过程 要实现本例,需要用到两方面知识:1.图像的高斯模糊. 2.在图像中去出感兴趣的圆形区域. 高斯模糊 用的是opencv函数:cvSmooth.该函数参数具体使用,看opencv官网的api介绍吧:http://docs.opencv.org/modules/refman.html #include <opencv2/core/core.hpp> #includ

opencv实现camera模组的暗电流和lenshading补偿

简介 在接触过的qcom和mtk平台中,camera调试软件和流程基本都是大同小异.所以查了点资料,然后模仿这些软件,自己练习写了下最开始的 两步:暗电流和len shading补偿. 基本原理 产生原因 在camera模组中,会因为sensor本身的暗电流,从而对图像参数噪声.同时也会因为模组镜头的原因,导致拍摄照片的亮度,中间亮而四周相对较暗. 所以在模组工作中,我们需要对模组做暗电流的校正和len shading相关的补偿.对这方面深入的了解,请自己查询相关资料吧,这里只简单讲解下. 校正

Android的回调模拟

想要彻底理解安卓中用的回调,最好的办法是自己写一个类似的实现安卓中回调功能的实现方法. 我自己写了一个可以实现setOnClickListener回调的工程: 具体目录: 工程源码的具体地址:http://pan.baidu.com/s/1c0hWPkk , View.java:模拟的是Android中的View控件, 1 package com.wyl.component; 2 3 import com.wyl.IntP.OnClickListener; 4 5 public class Vi

WINDOWS系统Eclipse+NDK+Android + OpenCv

WINDOWS系统Eclipse+NDK+Android + OpenCv 参考文档博客 1 NDK环境搭建 http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html 2 官方文档 Android.mk与Application.mk如何编写,OpenCV库如何调用 http://docs.opencv.org/trunk/doc/tutorials/introduction/android_binary_package/dev_

opencv配置指南

今天配置了一把opencv,在vs2013,Python.IDEA(Java)上分别作了配置.总结成文档,分享给大家. 搭建opencv+vs2013的环境 安装opencv3.0 alpha 和 vs2013 一:配置opencv的环境变量: 1:在系统变量增加变量OPENCV 新建button --> 输入变量名和变量的值,注意相应路径. 这么做的目的是为了为path做准备. 2:配置path的环境变量 双击path在后面加入 %OPENCV%\x86\vc12\bin .%OPENCV%就

opencv实现人像优化

简介 本篇是使用opencv,简单实现人像优化功能:美白.肤色.祛斑和磨皮.注:本篇所使用的图片来源自网络. 具体实现 总体框架 1.使用到了之前教程中的opencv实现button控件,每个功能,对应一个控件选择,然后都分别使用一个Trackbar,来手动控制,对图片处理的强度. 首先打开两幅图片,一张是作为操作选项的背景图片img,另一张是我们需要处理的图片dst_img,接着在在img显示窗口上,进行button的初始化 ButtonShow操作.最后分别对背景图片img和操作图片dst_

[openCV]基于Mouse Event的Paint的实现

1.关于Mouse Event 本文可能与图像处理不是有太大的关联,是openCV的HighGUI中关于Mouse Event的一些学习与练习,可能更偏向于编程吧.之前的程序中,也常常会使用cvWaitKey()去等待键盘的动作.与之相同的,Mouse Event也算是一个很典型的Callback机制了,对于Mouse Event的设置openCV中需要调用以下函数去实现. void cvSetMouseCallback(const char* window_name, CvMouseCallb

jsjl_for_ubuntu12.04

1. VC++代码: 1 #include <stdio.h> 2 #include <windows.h> 3 #include <wchar.h> 4 5 void MoveMouseZ(int _iX, int _iY); 6 HWND FindSubBtn01(HWND _hWndParent, char *pcSubWndText); 7 void PrintLocalTime(); 8 9 void main() 10 { 11 Sleep(1000 * 1

Android文件/文件夹选择器(支持多选操作),已封装为lib库,直接添加依赖即可。

话不多少,先上图一览: 接下来我们开始写个app测试: 1.新建Android工程:FileSelectorTest 2.更改MainActivity: 在里面写四个textview模拟button,分别是文件单选,文件多选,文件夹路径单选,文件夹路径多选,然后重写textview点击事件进入FsActivity,传入参数不同,选择模式不同. 复写onActivityResult,用来获取从文件/文件夹选择器传递回来的数据. package cn.darkranger.fileselectort