学习OpenCV3:OpenCV3.4.10的Scalar无法画出部分对应的颜色


1、背景

  现希望在白色背景图片上画出两条平行线,其颜色分别为蓝色和紫色。编写如下程序,发现可以画出蓝线,但画不出紫线。

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat img(400, 600, CV_32FC3, Scalar(255, 255, 255));                 // 白色背景图片
    line(img, Point(0, 100), Point(600, 100), Scalar(255, 0, 0), 2);    // 蓝色的线
    line(img, Point(0, 300), Point(600, 300), Scalar(240, 32, 160), 2); // 紫色的线
    imshow("image", img);
    waitKey();
    return 0;
}

2、测试与分析

  经如下程序测试发现,程序可以画出黑线、蓝线、绿线、红线、淡蓝线、粉线、黄线、但还是无法画出紫线。

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat img(400, 600, CV_32FC3, Scalar(255, 255, 255)); // 白色背景图片
    int n = 400 / 8;
    int m = n;
    line(img, Point(0, m), Point(600, m), Scalar(0, 0, 0), 2); // 黑色的线

    m += n;
    line(img, Point(0, m), Point(600, m), Scalar(255, 0, 0), 2); // 蓝色的线
    m += n;
    line(img, Point(0, m), Point(600, m), Scalar(0, 255, 0), 2); // 绿色的线
    m += n;
    line(img, Point(0, m), Point(600, m), Scalar(0, 0, 255), 2); // 红色的线

    line(img, Point(0, m), Point(600, m), Scalar(255, 255, 0), 2); // 淡蓝色的线
    m += n;
    line(img, Point(0, m), Point(600, m), Scalar(255, 0, 255), 2); // 粉色的线
    m += n;
    line(img, Point(0, m), Point(600, m), Scalar(0, 255, 255), 2); // 黄色的线

    m += n;
    line(img, Point(0, m), Point(600, m), Scalar(240, 32, 160), 2); // 紫色的线

    imshow("image", img);
    waitKey();
    return 0;
}

  在《学习OpenCV3》中,其创建一个数组的示例如下所示,发现其Scalar使用的是(1.0f, 1.0f, 1.0f),而不是(255, 255, 255),由此推测Scalar的取值范围是0.0f~1.0f,超出1.0f的数也看作1.0f,即紫线的(240, 32, 160)实际等价于白线的(1.0f, 1.0f, 1.0f),在白色背景图中画白线自然无法看出。

cv::Mat m(3, 10, CV_32FC3, cv::Scalar(1.0f, 1.0f, 1.0f));

  修改程序,将背景图片改为黑色,发现画出的紫线确实是白线。

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat img(400, 600, CV_32FC3, Scalar(0, 0, 0));                       // 黑色背景图片
    line(img, Point(0, 100), Point(600, 100), Scalar(255, 0, 0), 2);    // 蓝色的线
    line(img, Point(0, 300), Point(600, 300), Scalar(240, 32, 160), 2); // 紫色的线
    imshow("image", img);
    waitKey();
    return 0;
}

  故想画出紫线,应将其BGR缩小至0.0f~1.0f范围内,即Scalar(240/255, 32/255, 160/255)Scalar(240, 32, 160)/255

3. 修改

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    Mat img(400, 600, CV_32FC3, Scalar(255, 255, 255) / 255);                 // 白色背景图片
    line(img, Point(0, 100), Point(600, 100), Scalar(255, 0, 0) / 255, 2);    // 蓝色的线
    line(img, Point(0, 300), Point(600, 300), Scalar(240, 32, 160) / 255, 2); // 紫色的线
    imshow("image", img);
    waitKey();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34801642/article/details/107221294