实现功能:
1、以灰度图形式读入一幅彩色图像并在窗口中显示出来;
2、为该窗口添加鼠标左键点击响应,实现点击时在命令控制台输出点击位置像素坐标和像素值(每次点击输出一行信息);
3、在图像中绘制一个圆或椭圆或矩形,框住某个对象(不能随意框个位置),并在旁边输出与该对象相关的文本,用另一个窗口显示出来。
选作(可直接替换掉上述任务中的1和2):读入并显示一副彩色图象,实现鼠标左键点击彩色图象,输出对应像素的颜色值。
2
源码:
#include<opencv2\highgui.hpp>
#include<opencv2\core.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void onMouse(int event, int x, int y, int flags, void* param);
void main(){
Mat im=imread("test1.bmp",IMREAD_GRAYSCALE);
imshow("test1.bmp",im);
setMouseCallback(
"test1.bmp", // 捕获鼠标事件的窗口
onMouse, // 鼠标回调函数名
reinterpret_cast<void*>(&im) // 传图像对象指针
);
waitKey(0);
}
void onMouse(int event, int x, int y, int flags, void* param) {
Mat *im = reinterpret_cast<Mat*>(param);
switch (event) { // 什么鼠标事件?
case EVENT_LBUTTONDOWN: // 鼠标左键按下事件
// 输出(x, y)处像素值
cout << "坐标 (" << x << "," << y
<< ") 处像素值为: "
<< static_cast<int>(im->at <uchar>(Point(x, y)))
<< endl;
break;
}
}
程序结果:
2:
源码:
#include<opencv2\highgui.hpp>
#include<opencv2\core.hpp>
#include<opencv2\imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void onMouse(int event, int x, int y, int flags, void* param);
void main(){
Mat im=imread("test1.bmp",IMREAD_GRAYSCALE);
imshow("test1.bmp",im);
circle(
im, // 目标图像
Point(111, 224), //中心点坐标
65, //半径
0, //颜色(这里用黑色,针对灰度图像)
3 // 线的粗细
);
putText(
im, // 目标图像
"I am a bradge", // 文本(中文兼容不好)
Point(30, 300), // 文本位置
FONT_HERSHEY_PLAIN, // 字体类型(字体很有限)
2.0, // 字体大小
255,// 字体颜色(这里用白色,对于彩色图像则是蓝色)
2 // 文本粗细
);
imshow("test1.bmp",im);
waitKey(0);
}
最终结果: