namedWindow创建窗口的作用域

本文探讨了在编程中,主函数与子函数间变量的作用域限制,特别关注于imshow()函数如何能跨越这些限制,通过指针传递实现窗口的全局访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道,在主函数里面创建的变量是局部的,他的作用域就是主函数,子函数不能应用主函数里面的变量,同样主函数也不能应用子函数里面的变量,但是namedWindow创建的窗口确是全局的,在子函数创建的窗口可以直接在主函数里面用imshow直接调用,反之亦然。
这是因为imshow()函数的第一个参数窗口名是按指针传递的。

void opencvCreateAndShow(){ /** * @brief 从指定文件路径读取图像到 cv::Mat 对象中。 * * 使用 OpenCV 的 imread 函数将图像加载到内存中,图像格式为 BGR(默认)。 * * @param filename 图像文件的路径(支持绝对路径或相对于可执行文件的工作目录的相对路径)。 * @param flags 可选参数,指定图像读取方式。默认为 `cv::IMREAD_COLOR`。 * 常见选项: * - cv::IMREAD_COLOR : 默认值,以三通道彩色图形式读取; * - cv::IMREAD_GRAYSCALE : 以灰度图形式读取; * - cv::IMREAD_UNCHANGED : 包含 alpha 通道(如有)。 * * @return cv::Mat 返回包含图像数据的矩阵对象。如果图像无法加载,返回一个空矩阵(image.empty() == true)。 */ cv::Mat image = cv::imread("data/1.jpg"); /** * opencv创建和显示窗口 */ //1.使用opencv 自带的 cv::namedWindow 和 cv::imshow /** * @brief 创建一个 OpenCV 图像显示窗口。 * * 函数 `namedWindow` 用于创建一个带有指定名称的图像显示窗口, * 可以设置窗口的大小调整行为等属性。 * * @param winname 窗口的名称,用于后续操作该窗口(例如 imshow, destroyWindow 等)。 * @param flags 窗口的标志,控制窗口的行为。默认为 WINDOW_AUTOSIZE。 * 可选值包括: * - cv::WINDOW_AUTOSIZE:窗口大小由显示图像自动决定,不可手动调整; * - cv::WINDOW_NORMAL :允许用户自由调整窗口大小; * - cv::WINDOW_FULLSCREEN:全屏显示窗口; * - cv::WINDOW_FREERATIO:窗口大小可自由调整,图像无缩放填充。 * @return void 无返回值 */ cv::namedWindow("OpenCV Window", cv::WINDOW_AUTOSIZE); /** * @brief 在指定的 OpenCV 窗口中显示图像。 * * 函数 `imshow` 用于在之前创建窗口中显示图像。如果该窗口尚未创建, * 则会自动创建一个与图像同尺寸的窗口(行为取决于命名窗口时的 flags)。 * * @param winname 窗口名称,必须与 namedWindow 中定义的名称一致。 * @param image 要显示的图像(cv::Mat 类型),支持常见的图像格式(8UC1, 3UC3 等)。 * @note 必须配合 cv::waitKey() 使用才能正常刷新图像窗口。 * 若未调用 waitKey,图像可能不会显示或立即关闭。 */ cv::imshow("OpenCV Window", image); // 等待按键(0 表示无限等待任意按键,其他数字代表等待按键的时间,单位毫秒) cv::waitKey(0); // 销毁所有窗口 cv::destroyAllWindows(); //2.使用 QLabel 显示图像 // 将 cv::Mat 转换为 QImage QImage qimg(image.data, image.cols, image.rows, image.step, QImage::Format_BGR888); // 创建 QLabel 并设置图像 QLabel label; label.setPixmap(QPixmap::fromImage(qimg)); label.setWindowTitle("Qt + OpenCV"); label.resize(qimg.size()); label.show(); //3.使用 QGraphicsView 显示图像 QGraphicsScene scene; scene.addPixmap(QPixmap::fromImage(qimg)); QGraphicsView view(&scene); view.setWindowTitle("Qt + OpenCV with QGraphicsView"); view.resize(800, 600); view.show(); }这个qlabel一闪就没,我怎么暂停下来看显示效果
最新发布
06-14
``` #include <iostream> #include <thread> #include <opencv2/opencv.hpp> #include <MvCameraControl.h> MV_CC_DEVICE_INFO_LIST deviceList; using namespace cv; using namespace std; // 实时捕捉并处理图像的函数 void captureAndProcessVideo(int cameraIndex) { // 初始化设备 memset(&deviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST)); // 枚举设备 MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &deviceList); if (deviceList.nDeviceNum < 1) { cerr << "\n未找到设备!" << endl; return; } // 创建相机句柄 void* handle = nullptr; MV_CC_CreateHandle(&handle, deviceList.pDeviceInfo[cameraIndex]); // 打开设备 MV_CC_OpenDevice(handle); // 设置触发模式为连续 MV_CC_SetEnumValue(handle, "TriggerMode", 0); // 设置曝光时间 MV_CC_SetFloatValue(handle, "ExposureTime", 10000); // 设置增益 MV_CC_SetFloatValue(handle, "Gain", 2); // 设置帧率 MV_CC_SetFloatValue(handle, "AcquisitionFrameRate", 1500); // 设置像素格式为 Mono8 MV_CC_SetEnumValue(handle, "PixelFormat", 0x01080001); // 获取图像大小信息 MVCC_INTVALUE payloadSize; memset(&payloadSize, 0, sizeof(MVCC_INTVALUE)); if (MV_CC_GetIntValue(handle, "PayloadSize", &payloadSize) != MV_OK) { cerr << "\n错误:获取图像尺寸失败。" << endl; MV_CC_CloseDevice(handle); MV_CC_DestroyHandle(handle); return; } // 启动抓图 MV_CC_StartGrabbing(handle); string windowName = "Camera " + to_string(cameraIndex + 1); // 创建窗口名称 namedWindow(windowName, WINDOW_NORMAL); MV_FRAME_OUT frame; while (true) { // 等待抓取图像 if (MV_CC_GetImageBuffer(handle, &frame, 1000) == MV_OK) { // 转换为OpenCV格式 Mat img(frame.stFrameInfo.nHeight, frame.stFrameInfo.nWidth, CV_8UC1, frame.pBufAddr); // 在此处处理图像,例如显示图像 imshow(windowName, img); // 按下Esc退出 char key = waitKey(1); if (key == 27) { // ESC 键退出 cout << "\n" << windowName << "程序退出。" << endl; break; } // 释放图像缓冲 MV_CC_FreeImageBuffer(handle, &frame); } else { cerr << "\n抓图失败!" << endl; } } // 释放资源 MV_CC_StopGrabbing(handle); MV_CC_CloseDevice(handle); MV_CC_DestroyHandle(handle); } int main() { int choice; cout << "选择功能:\n" << "1. 处理单个实时捕捉\n" << "请输入选项 (1): "; cin >> choice; if (choice == 1) { captureAndProcessVideo(0); // 处理单个相机 } else { cout << "\n无效的选项!" << endl; } return 0; }```将此代码分成两个.cpp文件,一个文件是main()主函数,另一个是海康调用海康调用相机控制
03-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值