opencv——检测四边形的四个角点(二)

本文详细探讨了如何使用OpenCV库在图像处理中检测四边形的四个角点,包括关键步骤和算法原理,对于计算机视觉开发者极具参考价值。

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

#include "stdio.h"  
#include "cv.h"  
#include "highgui.h"  
#include "Math.h"
#define max_corners 4


int Otsu(IplImage* src);

int main(int argc, char*argv[])
{
    IplImage* img = cvLoadImage("C:\\Users\\aoe\\Desktop\\the last\\20160716_3DMeasurement\\1.jpg", 0);
    cvNamedWindow("img", 1);
    cvShowImage("img", img);

    double sum = 0.0;//求图像灰度平均值
    for (int y = 0; y < img->height; y++)
    {
        for (int x = 0; x < img->width; x++)
        {
            CvScalar cs = { 0.0 };
            cs=cvGet2D(img, y, x);
            sum += cs.val[0];
        }
    }
    double average = 0.0;//as.val[0]是double类型的数据
    average = sum / ((img->height)*(img->width));
    printf("sum=%lf\n", sum);
    printf("average=%lf\n", average);
    IplImage* aver = cvCreateImage(cvGetSize(img), 8, 1);//生成一幅像素值均为上一幅图像的像素的均值的图像
    for (int y = 0; y < aver->height; y++)
    {
        for (int x = 0; x < aver->width; x++)
        {
            CvScalar cs = { 0.0 };
            cs.val[0]=average;
            cvSet2D(aver, y, x,cs);
        }
    }
    cvNamedWindow("aver", 1);
    cvShowImage("aver", aver);


    IplImage* next = cvCreateImage(cvGetSize(img), 8, 1);//生成一幅像素值减去图像像素的均值的图像
    for (int y = 0; y < next->height; y++)
    {
        for (int x = 0; x < next->width; x++)
        {
            CvScalar cs = {
  
  0.0};
            cs = cvGet2D(img, y, x);
            CvScalar ds = { 0.0 };
            if (cs.val[0] > average)
                ds.val[0] = average;
            else
                ds.val[0] = cs.val[0];          
            cvSet2D(next, y, x, ds);
        }
    }
    cvNamedWindow("next", 1);
    cvShowImage("next", next);

    IplImage* dst = cvCreateImage(cvGetSize(img), 8, 1);
    int threshold = Otsu(next);//最大类间方差阈值分割
    printf("threshold = %d\n", threshold);
    cvThreshold(next, dst, threshold, 255, CV_THRESH_BINARY);

    cvNamedWindow("dst", 1);
    cvShowImage("dst", dst);

/*  IplImage* im_median_filter = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    cvSmooth(dst, im_median_filter, CV_MEDIAN, 3);//中值滤波
    cvNamedWindow("im_median_filter", 1);
    cvShowImage("im_median_filter", im_median_filter);*/

    CvRect roi = cvRect(30, 30, 120, 120);//去除复杂背景
    IplImage* img1 = cvCreateImage(cvGetSize(dst), dst->depth, dst->nChannels);
    for (
### YOLO 中四边形四个坐标的表示与处理 在YOLO系列模型中,对于四边形四个的坐标表示和处理主要依赖于特定版本的设计理念和技术细节。 #### Poly-YOLO中的多边形顶检测 Poly-YOLO引入了一种新的网格设计来适应更复杂的形状识别需求。该方法采用了基于圆形扇区的网格布局,其中心与对象包围框的中心一致。每个圆弧分割区域被分配去捕捉特定顶的位置信息,在极坐标系下记录度和距离参数。当某个扇区内不存在待测定时,则设定其对应的置信度分数为零[^1]。 #### 旋转框标记方式下的四边形定义 另一种常见的做法是在数据标注阶段就规定好顺序化的顶序列。例如,采用旋转矩形(Rotated Bounding Box, RBB)的方式,即先选定一个起作为参考基\( (x_1,y_1) \),之后沿顺时针方向连续指定其余三个的位置,形成完整的八元组描述\[ x_1,y_1,x_2,y_2,x_3,y_3,x_4,y_4\] 。这种模式不仅明确了各节间的相对关系,还便于后续计算过程中的解析操作[^2]。 #### Cornernet风格的关键热力图构建 为了更好地定位这些关键性的几何特征,某些改进型YOLO架构借鉴了CornerNet的思想,创建专门针对不同方位落或者边缘交界处的响应映射——热度图。这里会分别生成两个独立但相互关联的地图结构:一个是用来指示左上方位置的信息;另一个则是反映右下方情况的数据集合。每张地图内部都包含了C个通道,代表各自所属类型的数量,并且保持相同的分辨率大小H×W。值得注意的是,这里的分类体系并不包含所谓的“背景”选项,因为所有非目标实体都将默认视为无效输入而忽略掉[^3]。 ```python import cv2 import numpy as np def get_four_corners(box): """ Convert a bounding box to four corners. Args: box (list): A list of eight numbers representing the coordinates and category information [x1,y1,...,y4,category,difficult]. Returns: tuple: Four corner points represented by tuples ((x1,y1),(x2,y2),...). """ return [(box[i], box[i + 1]) for i in range(0, len(box)-2, 2)] # Example usage with OpenCV functions mentioned in reference [4] contours = ... # Assume contours are obtained from an image processing step using cv2.findContours() for cnt in contours: rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect).tolist()[::-1].flatten().tolist()[:8] + ['object', 'easy'] corners = get_four_corners(box) print(corners) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值