讲解points.checkVector(2, CV_32S) >= 0 in function ‘cv::fillConvex

举报
皮牙子抓饭 发表于 2024/01/02 09:33:31 2024/01/02
【摘要】 讲解 points.checkVector(2, CV_32S) >= 0 in function 'cv::fillConvexPoly'在OpenCV中,cv::fillConvexPoly是一个函数,用于在给定的多边形内填充颜色。它接受一个包含多边形顶点坐标的向量和一个用于填充的颜色。 在调用cv::fillConvexPoly函数之前,我们通常要确保传入的顶点坐标向量是正确的。此时,...

讲解 points.checkVector(2, CV_32S) >= 0 in function 'cv::fillConvexPoly'

在OpenCV中,cv::fillConvexPoly是一个函数,用于在给定的多边形内填充颜色。它接受一个包含多边形顶点坐标的向量和一个用于填充的颜色。 在调用cv::fillConvexPoly函数之前,我们通常要确保传入的顶点坐标向量是正确的。此时,我们会使用points.checkVector(2, CV_32S) >= 0来进行检查。 这段代码的含义是:检查顶点坐标向量的维度是否为2,并且数据类型是否为CV_32S(32位整数)。如果条件成立,则返回True,表示顶点坐标向量合法;如果条件不成立,则返回False,表示顶点坐标向量不合法。 在函数体内部,这个条件通常用于确保传入的顶点坐标向量满足要求,以避免出现运行时错误或意外情况。如果顶点坐标向量不正确,可能会导致填充的多边形形状不正确或程序崩溃。 下面是一段示例代码,演示了如何使用points.checkVector(2, CV_32S) >= 0进行顶点坐标向量的检查:

cppCopy code
#include <opencv2/opencv.hpp>
int main() {
    cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3);
    // 定义一个三角形的顶点坐标向量
    std::vector<cv::Point> points;
    points.push_back(cv::Point(50, 50));
    points.push_back(cv::Point(250, 100));
    points.push_back(cv::Point(150, 200));
    // 检查顶点坐标向量是否合法
    if (points.checkVector(2, CV_32S) >= 0) {
        // 顶点坐标向量合法,调用fillConvexPoly函数填充颜色
        cv::fillConvexPoly(image, points, cv::Scalar(255, 0, 0));
    } else {
        // 顶点坐标向量不合法,输出错误信息
        std::cout << "Invalid vertex coordinate vector!" << std::endl;
    }
    // 显示填充后的图像
    cv::imshow("Filled Image", image);
    cv::waitKey(0);
    return 0;
}

在上述示例代码中,我们创建了一个500x500的黑色图像,并定义了一个三角形的顶点坐标向量。然后我们使用if语句检查顶点坐标向量是否合法,如果合法则调用cv::fillConvexPoly函数填充三角形;如果不合法,则输出错误信息。最后,我们显示填充后的图像。 总结起来,points.checkVector(2, CV_32S) >= 0是OpenCV中用于检查顶点坐标向量是否合法的条件表达式。它确保顶点坐标向量的维度为2,并且数据类型为32位整数。通过使用这个条件表达式,我们可以确保在调用cv::fillConvexPoly函数之前传入的顶点坐标向量是正确的,从而避免潜在的错误或异常情况。


目标分割是将图像中的感兴趣对象从背景中分离出来的过程。在这个过程中,我们可以使用多边形来指定感兴趣对象的区域,并将其填充为不同的颜色以便于后续处理。 下面是一个示例代码,展示了如何使用cv::fillConvexPoly函数进行目标分割。假设我们已经使用其他方法(例如边缘检测或图像分割算法)得到了感兴趣对象的轮廓(contour)。

cppCopy code
#include <opencv2/opencv.hpp>
int main() {
    // 读取图像
    cv::Mat image = cv::imread("image.jpg");
    // 轮廓的顶点坐标向量
    std::vector<std::vector<cv::Point>> contours;
    // 定义一个空白的图像用于绘制填充后的结果
    cv::Mat result = cv::Mat::zeros(image.size(), CV_8UC3);
    // 假设通过其他方法得到了感兴趣对象的轮廓
    // 这里只是作为示例,手动定义了一个三角形的轮廓
    std::vector<cv::Point> contour;
    contour.push_back(cv::Point(100, 100));
    contour.push_back(cv::Point(200, 100));
    contour.push_back(cv::Point(150, 200));
    contours.push_back(contour);
    // 对每个轮廓进行操作
    for (const auto& contour : contours) {
        // 检查顶点坐标向量是否合法
        if (cv::checkVector(contour, 2, CV_32S) >= 0) {
            // 填充轮廓区域为红色
            cv::fillConvexPoly(result, contour, cv::Scalar(0, 0, 255));
        } else {
            // 顶点坐标向量不合法,输出错误信息
            std::cout << "Invalid vertex coordinate vector!" << std::endl;
        }
    }
    // 将原始图像与结果图像水平拼接显示
    cv::Mat combined;
    cv::hconcat(image, result, combined);
    
    // 显示拼接后的图像
    cv::imshow("Result", combined);
    cv::waitKey(0);
    
    return 0;
}

在上述示例代码中,我们首先读取一张图像,并定义一个空白的图像用于绘制填充结果。然后,我们手动定义了一个三角形的轮廓作为示例(实际中可以通过其他算法得到轮廓)。接下来,我们对每个轮廓进行操作,首先使用cv::checkVector函数检查顶点坐标向量的合法性,然后调用cv::fillConvexPoly函数将轮廓区域填充为红色。最后,我们将原始图像和填充结果水平拼接,并显示拼接后的图像。


cv::fillConvexPoly是OpenCV库中的一个函数,用于在图像上绘制填充了凸多边形的区域。 函数原型

cppCopy code
void fillConvexPoly(InputOutputArray img, InputArray points, const Scalar& color, int lineType=8, int shift=0)

参数解释

  • img:输入输出参数,表示待填充的图像。需要注意的是,这个图像必须是一个三通道的彩色图像(例如CV_8UC3)。
  • points:输入参数,表示凸多边形的顶点坐标向量。这个参数是一个std::vector类型,其中每个元素是一个cv::Point对象,代表一个顶点的坐标。
  • color:输入参数,表示填充的颜色。这个参数是一个cv::Scalar对象,可以通过cv::Scalar(b, g, r)来定义(其中bgr分别表示蓝色、绿色、红色的通道值)。
  • lineType:可选参数,表示线条类型,默认为8,表示8连接性的线条。
  • shift:可选参数,表示坐标点的小数位数,默认为0功能
  • cv::fillConvexPoly函数基于给定的凸多边形的顶点坐标向量,在输入的图像上填充该凸多边形的区域。
  • 凸多边形的填充区域使用指定的颜色进行填充。 注意事项
  • points参数中的顶点坐标必须按照顺时针或逆时针的顺序给出,以确保填充区域是凸多边形。
  • cv::fillConvexPoly函数只能用于填充凸多边形,不能用于填充其他类型的多边形(如非凸多边形)。
  • fillConvexPoly函数需要一个三通道的图像作为输入和输出。如果输入的图像不是三通道的,函数会抛出异常。 示例用法: 下面是一个示例代码,演示了如何使用cv::fillConvexPoly函数绘制一个红色的三角形。
cppCopy code
#include <opencv2/opencv.hpp>
int main() {
    // 创建一个空白图像,大小为300x300,三通道
    cv::Mat image = cv::Mat::zeros(300, 300, CV_8UC3);
    // 定义三角形的顶点坐标
    std::vector<cv::Point> triangle;
    triangle.push_back(cv::Point(150, 50));
    triangle.push_back(cv::Point(50, 250));
    triangle.push_back(cv::Point(250, 250));
    // 填充三角形区域为红色
    cv::fillConvexPoly(image, triangle, cv::Scalar(0, 0, 255));
    // 显示图像
    cv::imshow("Triangle", image);
    cv::waitKey(0);
    
    return 0;
}

上述示例代码创建了一个空白图像,然后定义了一个三角形的顶点坐标向量。接下来,调用cv::fillConvexPoly函数,将图像中的三角形区域填充成红色。最后,显示结果图像。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。