当前位置: 首页 > wzjs >正文

欧美独立站建站网络营销的推广

欧美独立站建站,网络营销的推广,什么网站可以免费做试卷,html个人网站案例文章目录 功能背景代码效果 功能 实现对形似宝马标的黄黑四象限光学识别标定位 背景 大学同学遇到了这个场景,琢磨了下,以备不时之需。 代码 所用opencv版本:4.12 numpy2.2.4 scikit_learn1.6.1import time import cv2 import numpy as…

文章目录

  • 功能
  • 背景
  • 代码
  • 效果

功能

实现对形似宝马标的黄黑四象限光学识别标定位

背景

大学同学遇到了这个场景,琢磨了下,以备不时之需。

代码

所用opencv版本:4.12

numpy==2.2.4
scikit_learn==1.6.1
import time
import cv2
import numpy as np
import math
from sklearn.cluster import KMeansdef calculate_tilt_angle(a, b):   # 确保 a >= bif a < b:a, b = b, a# 计算倾斜角度(弧度)theta_rad = math.acos(b / a)# 转为角度theta_deg = math.degrees(theta_rad)return theta_degdef compute_intersection(line1, line2):"""计算两条直线的交点"""(x1, y1), (x2, y2) = line1(x3, y3), (x4, y4) = line2# 计算分母den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)if den == 0:  # 直线平行return None# 计算交点坐标t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / denu = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / den# 判断交点是否在线段内if 0 <= t <= 1 and 0 <= u <= 1:x = x1 + t * (x2 - x1)y = y1 + t * (y2 - y1)return (int(x), int(y))else:return Nonedef calculate_angle(line1, line2):"""计算两条线段之间的夹角(度数)"""# 提取线段端点坐标(x1, y1), (x2, y2) = line1(x3, y3), (x4, y4) = line2# 计算方向向量vec1 = (x2 - x1, y2 - y1)vec2 = (x4 - x3, y4 - y3)# 计算向量模长mod1 = np.sqrt(vec1[0]**2 + vec1[1]**2)mod2 = np.sqrt(vec2[0]**2 + vec2[1]**2)if mod1 == 0 or mod2 == 0:return None  # 无效向量(线段长度为0)# 计算点积和夹角余弦dot_product = vec1[0] * vec2[0] + vec1[1] * vec2[1]cos_theta = dot_product / (mod1 * mod2)cos_theta = np.clip(cos_theta, -1.0, 1.0)  # 处理浮点误差# 计算角度(0°~180°)angle = np.degrees(np.arccos(cos_theta))return angleif __name__ == '__main__':use_camera_flag = 1fps_list = []prev_time = 0if use_camera_flag:cap = cv2.VideoCapture(2)   # 自己修改为摄像头对应IDwhile True:if use_camera_flag:current_time = time.time()ret, image = cap.read()else:# 读取图像image = cv2.imread("label.jpeg")# image = cv2.imread("label0.png")# image = cv2.imread("label1.png")# image = cv2.imread("label2.jpeg")hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 定义黄色和黑色的HSV阈值范围(需根据实际图像调整)lower_yellow = np.array([20, 100, 100])upper_yellow = np.array([40, 255, 255])lower_black_h = np.array([35,10,0])upper_black_h = np.array([120,230,255])lower_black_l = np.array([0,0,0])upper_black_l = np.array([120,120,60])lower_white = np.array([0,0,125])upper_white = np.array([180,50,255])# 创建黄色和黑色的掩模mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)mask_black = cv2.bitwise_or(cv2.inRange(hsv, lower_black_h, upper_black_h), cv2.inRange(hsv, lower_black_l, upper_black_l))mask_white = cv2.inRange(hsv, lower_white, upper_white)# 合并黑黄区域的掩模并减去白色部分的掩模mask_combined = cv2.bitwise_or(mask_yellow, mask_black) & ~mask_white# 形态学操作(去噪+连接区域)kernel = np.ones((5,5), np.uint8)mask_processed = cv2.morphologyEx(mask_combined, cv2.MORPH_CLOSE, kernel)mask_yellow = cv2.morphologyEx(mask_yellow, cv2.MORPH_CLOSE, kernel)mask_black = cv2.morphologyEx(mask_black, cv2.MORPH_CLOSE, kernel)# 查找轮廓contours, _ = cv2.findContours(mask_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)image_height, image_width = image.shape[:2]# 筛选最大轮廓(假设标记是图像中最显著的物体)if contours:for cnt in contours:if len(cnt) >= 5:  # 至少需要5个点才能拟合椭圆ellipse = cv2.fitEllipse(cnt)(center, (width, height), angle) = ellipse# 过滤条件:长宽均大于阈值if width > image_width / 50 and height > image_height / 50:# 创建空白掩膜(与原图同尺寸)ellipse_mask = np.zeros_like(image[:, :, 0], dtype=np.uint8)# 绘制填充的椭圆(白色)cv2.ellipse(ellipse_mask, ellipse, 255, -1)# --- 计算椭圆区域内的黄色和黑色占比 ---# 提取椭圆区域内的黄色部分yellow_in_ellipse = cv2.bitwise_and(mask_yellow, mask_yellow, mask=ellipse_mask)yellow_area = cv2.countNonZero(yellow_in_ellipse)# 提取椭圆区域内的黑色部分black_in_ellipse = cv2.bitwise_and(mask_black, mask_black, mask=ellipse_mask)black_area = cv2.countNonZero(black_in_ellipse)# 计算椭圆总面积ellipse_area = cv2.countNonZero(ellipse_mask)# 计算比例(避免除零错误)if ellipse_area > 0:yellow_ratio = yellow_area / ellipse_areablack_ratio = black_area / ellipse_area# 过滤条件:黄黑区域各占至少30%if yellow_ratio >= 0.3 and black_ratio >= 0.3:# 使用椭圆掩膜提取原图label_in_image = cv2.bitwise_and(image, image, mask=ellipse_mask)gray = cv2.cvtColor(label_in_image, cv2.COLOR_BGR2GRAY)                      edges = cv2.Canny(gray, threshold1=50, threshold2=150)# 直线检测与交点计算lines = cv2.HoughLinesP(edges, rho=1,                  # 距离分辨率(像素单位)theta=np.pi/180,        # 角度分辨率(弧度单位)threshold=50,           # 检测阈值(累加器投票数阈值)minLineLength=((width + height) / 2) / 4,       # 最小线段长度(短于此长度的线段被丢弃)maxLineGap=10           # 允许线段间的最大间隔(小于此间隔的线段合并))# 延长线段extended_lines = []if lines is not None:for line in lines:x1, y1, x2, y2 = line[0]# 延长线段,例如延长比例t=1.0t=1.0dx = x2 - x1dy = y2 - y1new_x1 = int(x1 - t * dx)new_y1 = int(y1 - t * dy)new_x2 = int(x2 + t * dx)new_y2 = int(y2 + t * dy)extended_lines.append([(new_x1, new_y1), (new_x2, new_y2)])# 计算交点intersections = []if extended_lines:for i in range(len(extended_lines)):for j in range(i+1, len(extended_lines)):line1 = extended_lines[i]line2 = extended_lines[j]# 计算夹角并过滤5°~175°以外的结果angle = calculate_angle(line1, line2)delta_angle = 85if angle is None or not (90 - delta_angle <= angle <= 90 + delta_angle):continuept = compute_intersection(line1, line2)if pt:# 检查交点是否在椭圆内# 椭圆参数来自ellipse变量# ellipse的格式是((h, k), (a, b), theta)(h, k), (a, b), theta_deg = ellipsetheta = np.deg2rad(theta_deg)x, y = pt# 转换到椭圆的标准坐标系x_trans = x - hy_trans = y - k# 旋转x_rot = x_trans * np.cos(theta) + y_trans * np.sin(theta)y_rot = -x_trans * np.sin(theta) + y_trans * np.cos(theta)# 判断是否在椭圆内if (x_rot**2)/(a**2) + (y_rot**2)/(b**2) <= 1:intersections.append(pt)# 聚类确定中心if intersections:X = np.array(intersections)kmeans = KMeans(n_clusters=1).fit(X)center_x, center_y = kmeans.cluster_centers_[0].astype(int)(h, k), (a, b), theta_deg = ellipse# (center_x, center_y) 即为目标点坐标cv2.circle(image, (center_x, center_y), int(((width + height) / 2) / 20 + 0.5), (0, 0, 255), int(((width + height) / 2) / 50 + 0.5))cv2.ellipse(image, ((float(center_x), float(center_y)), (a, b), theta_deg), (0, 255, 0), int(((width + height) / 2) / 50 + 0.5))  print("angle: {}, {}".format(calculate_tilt_angle(a, b), (a, b)))if use_camera_flag:fps = 1 / (current_time - prev_time)fps_list.append(fps)if len(fps_list) > 5:fps_list.pop(0)avg_fps = sum(fps_list) / len(fps_list)# 将帧率文本绘制到左上角cv2.putText(image,f"FPS: {fps:.2f}",  # 显示两位小数(10, 30),  # 左上角坐标 (x, y)cv2.FONT_HERSHEY_SIMPLEX,  # 字体1,  # 字体大小(255, 255, 255),  # 颜色 (BGR格式,白色)2,  # 字体厚度)# 显示结果cv2.namedWindow("Result", cv2.WINDOW_NORMAL)cv2.resizeWindow("Result", 500, 500)cv2.imshow("Result", image)if not use_camera_flag:cv2.waitKey(0)cv2.destroyAllWindows()cv2.imwrite("output.jpg", image)breakelse:prev_time = current_timeif cv2.waitKey(1) == ord('q'):cap.release()breakcv2.destroyAllWindows()

效果

部分图片取自c++识别象限标 —— 灯火~

在这里插入图片描述
在这里插入图片描述
具有一定的抗倾斜能力
在这里插入图片描述

http://www.dtcms.com/wzjs/141177.html

相关文章:

  • 餐饮食材配送网站开发企划书aso网站
  • 佛山附近做网站的公司重庆森林粤语
  • 企业局域网站建设模板百度域名注册官网
  • 大理石在哪些网站做宣传不知怎么入门
  • 开学第一课汉字做网站外包公司
  • 网站做贸易用什么色调比较好厦门seo网站推广优化
  • 源代码如何做网站今日油价92汽油价格调整最新消息
  • wordpress 管理员账号在哪里查询宁波谷歌seo
  • 河南河南省住房和城乡建设厅网站企业网站推广的形式有哪些
  • 手机网站建设制作教程视频即时热榜
  • 微电影网站模板产品推广词
  • 滁州新手跨境电商建站哪家好流量购买网站
  • 无域名公司注册seo优化方案项目策划书
  • 三五互联网站管理登录地址是多少搜索引擎营销的主要方式有哪些?
  • 营销单页网站制作独立网站
  • 智盈中心网站建设外包公司排名
  • 中国十大做网站公司排名网络运营师资格证
  • 江苏省交通运输厅门户网站建设管理办法西安seo培训机构
  • 做网站麻烦不手机维修培训班学校
  • 做食物网站做网络销售如何找客户
  • 网站优化的好处热点新闻事件
  • 做图标得英文网站seo关键词的选择步骤
  • 做外贸需要网站吗宁波seo搜索引擎优化公司
  • 广州做企业网站的公司看颜色应该搜索哪些词汇
  • 国内银行网站做的很垃圾百度广告优化
  • 南通哪些公司做网站互联网销售
  • 网站一直收录不了营销软文小短文
  • 网站版权 备案icp西安百度竞价托管
  • 三亚海棠警方拘留3名涉黄人员厦门seo关键词排名
  • 网站开发主要流程新郑网络推广外包