一、创建滑动条
createTrackbar(const String & trackbarname, const String & winname, int* value, int count, onChange =, TrackbarCallback 0, void * userdata =0)
trackbarname:滑动条的名称。
winname:创建滑动条窗口的名称。
value:指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义。
count:滑动条的最大取值。
onChange:每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo (int,void *) ;,其中第一个参数是轨迹栏位置,第二个参数是用户数据。如果回调是NULL指针,则不会调用任何回调,只更新数值。
userdata:传递给回调函数的可选参数。
滑动条创建样例如下:
//定义全局变量src
Mat src;
//回调函数,通过回调不断的显示新的图片
void callBack(int value, void*)
{
float a = value / 100.0;
Mat img2 = src * a;
imshow("demo", img2);
}
int main() {
src = imread("1.jpg");
//显示图像
namedWindow("demo");
imshow("demo", src);
//滑动条初始值
int value = 100;
//创建滑动条
createTrackbar("百分比", "demo", &value, 600, callBack, 0);
waitKey(0);
return 0;
}
二、鼠标事件相应
setMouseCallback(const String & winname, MouseCallback onMouse,void * userdata = 0)
winname:添加鼠标响应的窗口的名字
onMouse:鼠标响应的回调函数。
userdata:传递给回调函数的可选参数。
回调函数:文章来源:https://www.toymoban.com/news/detail-449709.html
typedef void(*cv::MouseCallback)(int event, int x, int y, int flags,void “userdata)
event:鼠标响应事件标志,参数为EVENT_*形式。
x:鼠标指针在图像坐标系中的x坐标。
y:鼠标指针在图像坐标系中的y坐标。
flags:鼠标响应标志,参数为EVENT_FLAG_*形式。
userdata:传递给回调函数的可选参数。
本节的样例如下:文章来源地址https://www.toymoban.com/news/detail-449709.html
Mat src;
Mat imgPoint;
Point prePoint;
void mouse(int event, int x, int y, int flags, void*)
{
//如果单机右键
if (event==EVENT_RBUTTONDOWN)
{
cout << "要使用左键" << endl;
}
//如果单机左键
if (event == EVENT_LBUTTONDOWN)
{
prePoint = Point(x, y);
cout << "起始坐标是" << prePoint << endl;
}
//鼠标按住左键移动
if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
{
//绘制鼠标移动轨迹
Point pt(x, y);
//绘制直线
line(src, prePoint, pt, Scalar(255, 255, 255), 2, 5, 0);
//将当前位置信息赋值给前一时刻信息,方便下一时刻继续移动
prePoint = pt;
imshow("1", src);
//通过改变图像像素显示鼠标移动轨迹
imgPoint.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
imgPoint.at<Vec3b>(y, x - 1) = Vec3b(255, 255, 255);
imgPoint.at<Vec3b>(y, x + 1) = Vec3b(255, 255, 255);
imgPoint.at<Vec3b>(y + 1, x) = Vec3b(255, 255, 255);
imgPoint.at<Vec3b>(y + 1, x) = Vec3b(255, 255, 255);
imshow("2", imgPoint);
}
}
int main(){
//读取图片
src = imread("1.jpg");
if (!src.data)
{
printf("不能打开空图片");
return -1;
}
//拷贝读入的图像
src.copyTo(imgPoint);
imshow("1", src);
imshow("2", imgPoint);
//鼠标响应
setMouseCallback("1", mouse, 0);
waitKey(0);
return 0;
到了这里,关于opencv_c++学习(十三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!