将亮度更改为区域外的像素

时间:2017-09-14 21:06:45

标签: c++ opencv

我有一个点设置到位置(x,y)和此点的两个角度。我在示例中画了两行用于演示,它应该如何显示。

现在我想要的是将亮度改为这些线以外的所有像素。

这是原始图片。

original image

这是一个例子,我想要的。

Wanted image

如果我拥有并知道输入图像,点和两个角度,如何使用Opencv(C ++)轻松更改像素?我知道很多解决方案,但我想要最简单的解决方案,如何检测哪些像素需要改变,哪些不需要改变。

3 个答案:

答案 0 :(得分:2)

一种方法是:

  1. 根据您的点和角度制作原始图像大小的二进制掩码(即绘制填充多边形)。
  2. 复制原始图像。将亮度变化应用于整个克隆图像。
  3. 根据蒙版将克隆的图像复制回原始图像。

答案 1 :(得分:1)

我从@Zindarod steps编写代码。希望能帮助别人。 角度处于下降状态。

void view(cv::Mat& frame, double angle_left, double angle_right, cv::Point center){
    int length = 1500;
    cv::Point left_view;
    left_view.x = (int)round(center.x + length * cos((angle_left * (CV_PI / 180))));
    left_view.y = (int)round(center.y + length * sin((angle_left * (CV_PI / 180))));

    cv::Point right_view;
    right_view.x = (int)round(center.x + length * cos((angle_right * (CV_PI / 180))));
    right_view.y = (int)round(center.y + length * sin((angle_right * (CV_PI / 180))));

    cv::Point pts[4] = { position_of_eyes, left_view, right_view, position_of_eyes };
    Mat mask = Mat(frame.size(), CV_32FC3, cv::Scalar(1.0, 1.0, 0.3));
    cv::fillConvexPoly(mask, pts, 3, cv::Scalar(1.0,1.0,1.0));
    cv::cvtColor(frame, frame, CV_BGR2HSV);
    frame.convertTo(frame, CV_32FC3);
    cv::multiply(frame, mask, frame);
    frame.convertTo(frame, CV_8UC3);
    cv::cvtColor(frame, frame, CV_HSV2BGR);
}

答案 2 :(得分:0)

给定原点和两个角度,你可以为你的两条线计算2个单位向量,让它们为unitA和unitB。

对于图像的每个像素,请执行以下步骤:
1.从原点到像素获得一个向量(称为vec)。
2.找到vec和参考矢量(refVec)之间的角度(ang)。
3.如果ang大于refVec和unitA之间的角度,但小于refVec和unitB之间的角度,则重新着色像素。