一个简单的获取显示器长宽和显示器分辨的代码

本文介绍如何在大屏显示项目中,通过JavaScript获取浏览器窗口的设备像素比和屏幕分辨率,以便于本地调整,提升显示效果。

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

 最近在做大屏显示,在现显示的时候有些显示器是不规则的,投到大屏上显示效果不好,可以直接获取显示器的分辨率,本地调整好,再直接部署。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>获取显示器的分辨率</title>
    <script>
        window.onload = function() {
            var pixelRatio = window.devicePixelRatio;
            var screenWidth = window.screen.width * pixelRatio;
            var screenHeight = window.screen.height * pixelRatio;

            var resolutionInfo = "水平分辨率: " + screenWidth + "px, 垂直分辨率: " + screenHeight + "px";
            document.getElementById("resolutionInfo").innerText = resolutionInfo;
			
			
			var screenWidth2 = window.screen.width;
            var screenHeight2 = window.screen.height;

            var displayInfo = "显示器宽度: " + screenWidth2 + "px, 显示器高度: " + screenHeight2 + "px";
            document.getElementById("displayInfo").innerText = displayInfo;

			
			
        };
    </script>
</head>
<body>
    <h1>显示器的分辨率</h1>
    <p id="resolutionInfo">正在获取分辨率信息...</p>    
	<h1>获取显示器的长宽</h1>
   
	 <p id="displayInfo">获取显示器的长宽信息...</p>
</body>
</html>


<think>好的,用户希望改进现有的OpenCV显示器检测代码,以解决复杂背景下的精确识别问题。用户之前提供的代码基于轮廓检测评分系统,但在复杂背景下效果不佳。现在需要结合用户提供的引用之前的改进建议来优化代码。 首先,回顾用户的历史对话,之前提出的改进包括预处理优化、边缘检测增强、形态学处理自适应以及轮廓筛选策略。引用中提到的项目使用了YOLOOCR,可能可以考虑结合深度学习,但用户明确要求提供OpenCV的优化代码,所以可能暂时不需要引入深度学习,但可以参考其中的预处理方法。 用户提供的引用[1]提到了图像扶正文本识别,其中可能涉及边缘检测形态学操作,这与当前问题相关。引用[2]中的答题卡识别使用了传统图像处理改进的方法,可能对处理复杂背景有借鉴意义,比如多特征融合。引用[3]的相机标定可能不直接相关,但预处理步骤可能有帮助。 接下来需要将之前的改进建议转化为代码。比如,使用CLAHE增强对比度,转换到LAB色彩空间,动态调整Canny参数,自适应形态学核,以及更严格的轮廓筛选条件。同时,可能需要添加透视变换来扶正显示器,如引用[1]中的做法。 另外,用户之前的回答提到了纹理分析,比如LBP特征,这可能帮助区分显示器的均匀区域复杂背景。需要将这一点集成到代码中,计算局部纹理的方差来筛选轮廓。 还需要考虑多步骤验证,比如先检测大轮廓,再进行几何纹理验证。同时,可能需要加入边缘密度分析,因为显示器边缘通常有较高的密度。 现在需要整合这些改进点,确保代码结构清晰,步骤明确,参数可调。可能遇到的问题包括参数调优不同背景的适应性,因此在代码中加入参数注释,方便用户调整。 最后,测试代码的有效性,确保在复杂背景下能准确识别显示器,并输出结果。可能需要用户提供测试图像来进一步验证,但代码应包含必要的注释调整建议。</think>根据您的要求,结合引用文献计算机视觉最佳实践,我将为您提供一套改进的显示器检测方案。以下代码融合了多特征融合、自适应参数调整几何验证等技术,特别优化了复杂背景下的识别效果。 ```python import cv2 import numpy as np from skimage import feature def enhanced_display_detection(img_path): # 初始化参数 min_area_ratio = 0.08 # 最小面积比例 max_area_ratio = 0.6 # 最大面积比例 aspect_range = (0.7, 1.8) # 宽高比范围 # 图像读取与预处理 orig = cv2.imread(img_path) if orig is None: raise ValueError("图像加载失败,请检查路径") # 1. 自适应对比度增强 lab = cv2.cvtColor(orig, cv2.COLOR_BGR2LAB) l_channel, a_channel, b_channel = cv2.split(lab) clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8)) enhanced_l = clahe.apply(l_channel) enhanced_lab = cv2.merge([enhanced_l, a_channel, b_channel]) enhanced = cv2.cvtColor(enhanced_lab, cv2.COLOR_LAB2BGR) # 2. 多通道边缘检测 gray = cv2.cvtColor(enhanced, cv2.COLOR_BGR2GRAY) edges = np.zeros_like(gray) # 动态Canny阈值 v = np.median(gray) lower = int(max(0, (1.0 - 0.33) * v)) upper = int(min(255, (1.0 + 0.33) * v)) edges = cv2.Canny(gray, lower, upper) # 3. 自适应形态学处理 kernel_size = max(3, int(min(enhanced.shape[:2])/300)) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernel_size, kernel_size)) closed = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel, iterations=2) # 4. 多级轮廓检测 contours, _ = cv2.findContours(closed, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) best_cnt = None max_score = 0 img_h, img_w = enhanced.shape[:2] img_area = img_h * img_w for cnt in contours: # 基础几何过滤 area = cv2.contourArea(cnt) if not (img_area*min_area_ratio < area < img_area*max_area_ratio): continue # 最小外接矩形验证 rect = cv2.minAreaRect(cnt) (x, y), (w, h), angle = rect if w == 0 or h == 0: continue aspect = max(w, h) / min(w, h) if not (aspect_range[0] < aspect < aspect_range[1]): continue # 几何得分计算 rect_area = w * h area_ratio = area / rect_area if area_ratio < 0.7: # 排除非矩形轮廓 continue # 纹理特征验证 mask = np.zeros_like(gray) cv2.drawContours(mask, [cnt], -1, 255, -1) roi = cv2.bitwise_and(enhanced, enhanced, mask=mask) # LBP纹理分析 lbp = feature.local_binary_pattern(cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY), 8, 1, method='uniform') texture_score = 1 - np.var(lbp)/5000 # 显示器区域纹理方差较小 # 综合评分 center_dist = np.linalg.norm([x-img_w/2, y-img_h/2]) center_score = 1 - (center_dist / (img_w/2)) total_score = 0.4*texture_score + 0.3*area_ratio + 0.3*center_score if total_score > max_score: max_score = total_score best_cnt = cnt # 后处理与输出 if best_cnt is not None: # 获取精确外接矩形 rect = cv2.minAreaRect(best_cnt) box = cv2.boxPoints(rect).astype(int) # 透视变换校正 warped = four_point_transform(orig, box.reshape(4, 2)) # 绘制结果 cv2.drawContours(orig, [box], 0, (0,255,0), 3) cv2.putText(orig, f"Display {rect[1][0]:.0f}x{rect[1][1]:.0f}", tuple(box[0]), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,255), 2) return orig, warped else: return orig, None def four_point_transform(image, pts): # 透视变换函数 rect = order_points(pts) (tl, tr, br, bl) = rect widthA = np.linalg.norm(br - bl) widthB = np.linalg.norm(tr - tl) maxWidth = max(int(widthA), int(widthB)) heightA = np.linalg.norm(tr - br) heightB = np.linalg.norm(tl - bl) maxHeight = max(int(heightA), int(heightB)) dst = np.array([ [0, 0], [maxWidth-1, 0], [maxWidth-1, maxHeight-1], [0, maxHeight-1]], dtype="float32") M = cv2.getPerspectiveTransform(rect, dst) warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight)) return warped def order_points(pts): # 坐标点排序 rect = np.zeros((4, 2), dtype="float32") s = pts.sum(axis=1) rect[0] = pts[np.argmin(s)] rect[2] = pts[np.argmax(s)] diff = np.diff(pts, axis=1) rect[1] = pts[np.argmin(diff)] rect[3] = pts[np.argmax(diff)] return rect if __name__ == "__main__": input_img = "test.jpg" result, warped = enhanced_display_detection(input_img) cv2.imshow("Detection Result", result) if warped is not None: cv2.imshow("Corrected View", warped) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 关键技术改进说明 1. **多阶段特征融合** 融合了几何特征(面积、长宽比)、空间特征(中心距离)纹理特征(LBP方差),通过加权评分机制选择最优候选。其中LBP纹理分析能有效区分显示器的均匀表面与复杂背景[^2]。 2. **动态参数调整** - Canny阈值基于图像中值动态计算:$T_{low}=0.67v,\ T_{high}=1.33v$,其中$v$为图像中值 - 形态学核尺寸与图像分辨率正相关:$k=\max(3, W/300)$ - 面积阈值动态范围:$0.08 < S/W/H < 0.6$ 3. **透视变换校正** 采用`four_point_transform`函数对检测到的显示器进行平面校正,该技术常用于文档扫描图像扶正[^1]。 4. **多维度验证机制** ```mermaid graph TD A[候选轮廓] --> B{基础几何过滤} B -->|通过| C[矩形度验证] C -->|通过| D[纹理特征分析] D -->|通过| E[综合评分排序] E --> F[最优结果] ``` ### 参数调优建议 | 参数类别 | 推荐值范围 | 调整建议 | |----------------|-------------------|-----------------------------------| | CLAHE限制阈值 | 2.0-4.0 | 光照不均时增大 | | LBP方差阈值 | 3000-6000 | 背景复杂时降低 | | 形态学迭代次数 | 2-4 | 根据边缘连续性调整 | | 宽高比范围 | (0.7, 1.8) | 根据显示器实际比例调整 | ### 扩展改进方向 1. **深度学习辅助** 可参考YOLO框架训练显示器检测模型,与传统方法形成混合检测系统[^2]。当传统方法失效时,调用深度学习模型进行验证。 2. **三维姿态估计** 结合相机标定参数[^3],可估算显示器的三维空间位置,适用于增强现实等应用场景。 3. **动态背景建模** 对视频流场景,可采用背景减除算法(如MOG2)分离动态背景干扰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舰长115

码字不易如果觉得还不错谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值