背景
先说说什么情况下会需要进行这样的操作:
在实际项目中,我们一般都是在UI上创建窗口,用于显示检测的图像和处理相关的信息。如果要将窗口上所有内容全都保存下来的话会用到dump_window和write_image算子,这个时候保存的图像分辨率为界面上相应窗口控件的分辨率大小,而不是相机本身成像的分辨率大小,然后客户反映图像放大到相同倍数的时候我这个图像更小,所以就有了这个需求。
处理思路和方法
我想到了两种方法,下面具体讲一下这两种方法的实现思路:
第一种方法:很明显,dump_window后截取的图像分辨率和界面上窗口控件分辨率一样,那我就在界面上打开一个分辨率和相机分辨率相同的窗口,然后在这个窗口dump_window,生成的图像分辨率就和相机本身分辨率一样了。但是这里有一个问题,因为正常情况下,我们在界面上创建的可显示的窗口控件分辨率都远小于相机的分辨率,看下面这段代码
第一行:获取界面上IDC_Picture1这个控件的句柄,这个控件就是我们要显示图像的窗口
第二行:获取控件的大小和位置等信息
第三行:打开窗口,前两个参数是窗口的左上角坐标,然后是窗口的宽和高,再是将窗口和界面上的IDC_Picture1控件绑定,然后设置可见,最后一个是窗口的句柄。
上面是正常情况下的代码,但是按前面的说法,窗口大小应该设置成相机的分辨率大小,也就是下面这句代码:
,但是如果我们这么打开窗口的话,窗口显示的内容就不会是整个图像了,而是其中的一部分,所以直接将显示窗口设置成相机分辨率大小是不可行的。
解决方法是,创建两个窗口,一个用来显示程序运行时处理的图像和信息;另一个创建成相机分辨率大小,但是内容不显示到界面。下面所示的是两个窗口的创建代码:
这两个唯一的区别就是设置窗口的位置和大小,其中第二个窗口我在控件操作时就已经将控件设为不可见了,相当于第二个窗口在程序运行时是不可见的,在需要保存图像时,在G::HW4这个窗口使用dump_window然后 保存图像就可以达到所需要的效果。
这个方法的缺点是操作比较麻烦,程序中显示图像信息要显示到HW1,为了保证保存图像时效果和界面上显示一样,每次对HW1进行操作时也要对HW4进行同样的操作。
下面所讲的第二种方法操作就比较便捷了。
第二种方法:只需要创建一个窗口,使用dump_window截取窗口内容后,改变图像的分辨率,再进行保存,保存的图像分辨率同样和相机的分辨率相等,但缺点是放大到同等倍数,图像不如第一种清晰,但是更加方便。
创建窗口和前面一样,不同的是在dump_window后调用zoom_image_size算子设置成想要的分辨率,然后再write_image保存,代码如下: