学习OpenCV——去除imshow的内部细小边框(修改highgui)

本文介绍了如何解决在OpenCV中全屏显示图像时出现细小边框的问题。通过查找资料和尝试,发现需要修改OpenCV的源码,具体涉及`window_w32.cpp`文件中的`cvNamedWindow`函数和`icvCalcWindowRect`函数,取消WS_SIZEBOX属性以消除边框。重新编译highgui.dll后,成功实现无边框全屏显示。

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

今天用到了OpenCV的全屏函数:

					namedWindow("FullScreen",CV_WINDOW_NORMAL);
					setWindowProperty("FullScreen", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN );

但是,当全屏后发现一个以前从来没有注意过的问题——图像的左上边框处有一个大概1像素的白框,由于我要将全屏图像进行投影,我的图像背景又是黑色,黑底白框非常明显,因此这个问题必须解决。

Screenshot showing border of window when in full screen mode. **Note**: the screenshot was cropped to show only top-left corner

通过google和大家的帮助找到一些资料,国外大牛也遇到过这种问题

OpenCV中,使用C++通过摄像头实现实捕捉特定颜色的物体并画出边界框,通常需要以下几个步骤: 1. **包含头文件**: 首先,你需要包含OpenCV的视频处理、图像操作以及颜色匹配相关的库文件: ```cpp #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> ``` 2. **初始化摄像头**: 使用`cv::VideoCapture`打开默认摄像头(0号摄像头),或者指定具体的设备ID: ```cpp cv::VideoCapture cap(0); if (!cap.isOpened()) { std::cerr << "Error opening camera" << std::endl; return -1; } ``` 3. **设置循环捕获帧**: 使用while循环读取每一帧: ```cpp cv::Mat frame, color_frame; while (true) { cap >> frame; // 读取一帧 if (frame.empty()) break; // 如果无法获取帧,退出循环 ``` 4. **颜色检测**: 使用HSV色彩空间,创建一个颜色范围的矩形,例如如果你想要匹配红色物体: ```cpp cv::Scalar lower_red(0, 50, 50); // 红色的下限 cv::Scalar upper_red(10, 255, 255); // 红色的上限 cv::inRange(frame, lower_red, upper_red, color_frame); // 将原图转换为黑白,仅保留红色部分 ``` 5. **边缘检测和轮廓提取**: 对检测到的颜色区域应用边缘检测算法(如Canny算子),然后找到轮廓: ```cpp std::vector<std::vector<cv::Point>> contours, hierarchy; cv::findContours(color_frame, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE); ``` 6. **绘制边界框**: 遍历轮廓,对每个轮廓应用`cv::drawContours`函数画出边界框: ```cpp for (size_t i = 0; i < contours.size(); ++i) { cv::rectangle(frame, cv::boundingRect(contours[i]), cv::Scalar(0, 0, 255), 2); // 红色边界框 } ``` 7. **显示结果**: 最后,使用`imshow`函数显示原始帧和处理后的帧: ```cpp cv::imshow("Color Detection", frame); cv::imshow("Detected Colors", color_frame); ``` 8. **键盘中断**: 添加键盘事件检查,当用户按下Esc键退出循环: ```cpp int key = cv::waitKey(1); if (key == 27) break; // Esc键退出 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值