文章目录
HighGUI模块的设计目的是对 opencv 图像处理功能进行快速尝试并将结果可视化:
- 创建和操作可以显示图像并“记住”其内容的窗口(无需处理来自操作系统的绘制事件);
- 在窗口中添加轨迹栏,处理简单的鼠标事件以及键盘命令。
1 HighGUI 类
HighGUI 类在 org.opencv.highgui 包内:
类中的方法
方法 | 说明 |
---|---|
static javax.swing.JFrame createJFrame(java.lang.String title, int flag) | 创建 JFrame 实例,也就是 Java 版的窗口对象 |
static void destroyAllWindows() | 注销所有打开的窗口 |
static void destroyWindow(java.lang.String winname) | 注销指定名称的窗口 |
static void imshow(java.lang.String winname, Mat img) | 在窗口中显示图像 |
static void moveWindow(java.lang.String winname, int x, int y) | 移动窗口位置 |
static void namedWindow(java.lang.String winname) | 创建命名窗口 |
static void namedWindow(java.lang.String winname, int flag) | |
static void resizeWindow(java.lang.String winname, int width, int height) | 更改窗口尺寸 |
static java.awt.Image toBufferedImage(Mat m) | |
static void waitKey() | 等待关闭 |
static int waitKey(int delay) |
其中最常用的方法是 imshow 方法,用来显示 Mat 对象所表示的图像。
如果窗口是使用 window_AUTOSIZE 标志创建的,则图像将以其原始大小显示,但仍受屏幕分辨率的限制。否则,将缩放图像以适应窗口。该功能可以根据图像的深度缩放图像:
- 如果图像是8位无符号的,则按原样显示;
- 如果图像是16位无符号的,则像素除以256。也就是说,值范围[0,255*256]被映射到[0,255];
- 如果图像是32位或64位浮点,则像素值乘以255。也就是说,值范围[0,1]被映射到[0,255];
- 由于所需变换的模糊性,不再处理32位整数图像。使用特定于图像上下文的自定义预处理将其转换为8位无符号矩阵。
如果需要显示大于屏幕分辨率的图像,则需要在 imshow 之前调用 namedWindow("",WINDOW_NORMAL)。
imshow 方法之后应该调用 waitKey(),然后再执行 GUI 管理任务。否则,它将不会显示图像,窗口可能会锁定。例如,waitKey(0) 将无限显示窗口,直到按任意键为止(它适用于图像显示)。waitKey(25)将显示一帧,并等待大约25毫秒,等待按键(适用于逐帧显示视频)。要删除窗口,请使用 destroyWindow。
waitKey() 方法,会等待直到有键按下!
2 显示图像
public void showTest(){
Mat mat = new Mat(480, 640, CV_8U);
for (int i = 0; i < mat.rows(); i++) {
for (int j = 0; j < mat.cols(); j++) {
boolean a = i%100 > 50;
boolean b = j%100 > 50;
if (a && b || (!a && !b)) {
mat.put(i, j, 0);
} else {
mat.put(i, j, 255);
}
}
}
HighGui.imshow("Test", mat);
HighGui.waitKey();
}
执行程序,会打开窗口,并显示 mat 对象中的图像: