OpenCV:使用渐变色绘制直线

4
假设我有两个不同颜色的点,如何使用OpenCV(不管是Python还是C++)绘制它们之间的直线,使得直线的颜色从一个颜色渐变到另一个颜色?似乎用OpenCV并不容易实现,但如果有人知道简单的解决方法,请帮助我)。
谢谢。

Python的结果请参考:https://dev59.com/AlwY5IYBdhLWcg3wsphj - Jeru Luke
2个回答

5

OpenCV包含一个LineIterator

它处理数学计算并提供所有像素坐标。

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

int main()
{
    cv::Mat canvas { 50, 50, CV_32FC3, cv::Scalar::all(0.2) };
    
    cv::Point pt1 { 10,30 };
    cv::Point pt2 { 40,20 };

    cv::Vec3f color1 { 0,1,1 }; // yellow
    cv::Vec3f color2 { 1,1,0 }; // cyan

    // see https://docs.opencv.org/master/dc/dd2/classcv_1_1LineIterator.html
    cv::LineIterator it { canvas, pt1, pt2, 8 };

    for (int i = 0; i < it.count; ++i, ++it)
    {
        float alpha = i / (float)(it.count - 1); // 0..1 along the line

        cv::Vec3f blended = color1 * (1-alpha) + color2 * (alpha);

        canvas.at<cv::Vec3f>(it.pos()) = blended;
    }

    // show picture
    cv::namedWindow("canvas", cv::WINDOW_NORMAL);
    cv::resizeWindow("canvas", 500, 500);
    cv::imshow("canvas", canvas);
    cv::waitKey(-1);

    return 0;
}

enter image description here


1
一个简单的解决方案是生成中间点,并在它们之间绘制较小的线条,每个线条都有以下渐变阴影。类似下面的代码可能会完成这项工作:
past_center = intermediate_points[0]
for i, point in enumerate(intermediate_points, start=1):
        color_val = int(np.sqrt(64 / float(i + 1)) * 2)
        if color_val < 1:
            color_val = 0                              
        cv2.line(frame, (int(past_point[0]), int(past_point[1])), (int(point[0]), int(point[1])), (color_val, color_val, color_val), thickness)
        past_point = point

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接