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;
}