opencv里自带一个HIGHGUI 函数 imshow 可以显示图像
函数格式:
void imshow(const string& winname, InputArray mat);
参数说明:
第一个参数:const string&类型的winname,指需要显示的窗口标识名称。
第二个参数:InputArray类型的mat,指需要显示的图像。
正常测试读取图片:
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
int main()
{
namedWindow("Test",CV_WINDOW_AUTOSIZE);
Mat Frame = imread("2.jpg");
imshow("Test",Frame);
waitKey(0);
return 0;
}
上面都是带了标题栏。
不带标题栏,并且指定显示位置的方法:
1.创建窗口,并且移动窗口到指定位置
- WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。
namedWindow("WINDOW", CV_WINDOW_AUTOSIZE);
moveWindow("WINDOW", 500, 500); //窗口左上角在坐标(500,500)的位置上
2.设置窗口参数
- CV_WINDOW_NORMAL = 0x000000000 // 将窗口更改为正常大小或使窗口可调整大小
- CV_WINDOW_AUTOSIZE = 0x00000001 // 通过显示的图像约束大,窗口不能调整大小
- CV_WINDOW_FULLSCREEN = 1 // 将窗口更改为全屏
- CV_WINDOW_FREERATIO = 0x00000100 // 图像尽可能地扩展(没有比例约束)
- CV_WINDOW_KEEPRATIO = 0x00000000 // 使窗口可调整大小,但保留显示图像的比例
setWindowProperty("WINDOW", CV_WINDOW_FULLSCREEN, CV_WINDOW_FULLSCREEN);
3.创建窗口句柄
FindWindow:
- 函数获得一个顶层窗体的句柄,该窗体的类名和窗体名与给定的字符串相匹配。
- 该函数不查找子窗体。在查找时不区分大写和小写。
- 成功返回句柄,失败返回0。
字符串前加L:
- unicode字符集是两个字节组成的。
- L告示编译器使用两个字节的 unicode 字符集。
- 如 L"WINDOW" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。
衍生字符串前加_T :
- _T宏可以把一个引号引起来的字符串。
- 根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式。
- 如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("WINDOW") 相当于 L"WINDOW" ,这是宽字符串。
- 如果没有定义,那么_T宏不会在字符串前面加那个L,_T("WINDOW") 就等价于 "WINDOW"
HWND win_handle = FindWindow(0, L"input");
if (!win_handle)
{
printf("Failed FindWindow\n");
return -1;
}
4.设置
BOOLSetWindowPos( HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
- 该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。
- 窗口弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高。
- 并且被设置为Z序的第一个窗口。
- hWnd: 窗口句柄。
- hWndInsertAfter : 窗口的 Z 顺序。
- X, Y :以客户坐标指定窗口新位置的左边界和顶边界。
- cx, cy:以像素指定窗口的新的宽度和新的高度。
- uFlags :窗口尺寸和定位的标志。
UINT uFlags 的参数可以是下列的组合:
- SWP_ASNCWINDOWPOS: 如果调用进程不拥有窗口,系统会向拥有窗口的线程发出消息。这就防止调用线程在其他线程处理需要的时候发生死锁。
- SWP_DEFERERASE:防止产生WM_SYNCPAINT消息。
- SWP_DRAWFRAME:在窗口周围画一个边框(定义在窗口类描述中)。
- SWP_FRAMECHANGED:给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。
- SWP_HIDEWINDOW;隐藏窗口。
- SWP_NOACTIVATE:不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。
- SWP_NOCOPYBITS:清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。
- SWP_NOMOVE:维持当前位置(忽略X和Y参数)。
- SWP_NOOWNERZORDER:不改变z序中的所有者窗口的位置。
- SWP_NOREDRAW: 不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。
- SWP_NOREPOSITION;与SWP_NOOWNERZORDER标志相同。
- SWP_NOSENDCHANGING:防止窗口接收WM_WINDOWPOSCHANGING消息。
- SWP_NOSIZE:维持当前尺寸(忽略cx和Cy参数)。
- SWP_NOZORDER:维持当前Z序(忽略hWndlnsertAfter参数)。
- SWP_SHOWWINDOW:显示窗口。
unsigned int flags = (SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
flags &= ~SWP_NOSIZE;
unsigned int x = 0;
unsigned int y = 0;
unsigned int w = 1136;
unsigned int h = 639;
SetWindowPos(win_handle, HWND_NOTOPMOST, x, y, w, h, flags);
5.无边框设置
SetWindowLong(win_handle, GWL_STYLE, GetWindowLong(win_handle, GWL_EXSTYLE) | WS_EX_TOPMOST);
ShowWindow(win_handle, SW_SHOW);
后面就是直接读取图片或者视频在这个窗口里播放就可以了 ,效果如下,根据经验最好是循环读取或者播放。
以上均为学习笔记。