图像中不规则四边形区域用其他颜色覆盖,并可修改其透明度

      在做项目的过程中,遇到了一个需求,就是将车道线检测结果在上位机软件中显示。为了更好的显示车道线的检测效果,由之前的画车道线改成了画车道线之间的路面区域。

       那么问题来了,如何在四个点形成的区域内添加其他颜色,并保证可以修改透明度?

       我尝试过使用addWeighted函数,该函数是将相同大小,相同通道数的两幅图像进行融合,该函数的用法如下:


addWeighted函数

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray
dst, int dtype=-1)

第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。

第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。
第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。


   这个方法有个缺陷,必须要生成一个与原图像相同大小和相同通道数的纯色图像进行融合。然而考虑到显示的实时性,最终还是放弃了这种方法。

    后来,我想到了一个方法,从图像的像素值入手,通过改变图像的像素值来达到改变该区域的颜色目的。

    首先,要确定车道线检测输出的四个点A、B、C、D确定的区域,IsPointInRect()函数功能是判断该点是否在该不规则四边形的区域内。如果在该区域内,则修改该点的像素值。  废话少说,直接上代码!


bool isPointInRect(int x, int y,Point A,Point B,Point C,Point D)

{
    int a = (B.x - A.x)*(y - A.y) - (B.y - A.y)*(x - A.x);
    int b = (C.x - B.x)*(y - B.y) - (C.y - B.y)*(x - B.x);
    int c = (D.x - C.x)*(y - C.y) - (D.y - C.y)*(x - C.x);
    int d = (A.x - D.x)*(y - D.y) - (A.y - D.y)*(x - D.x);
    if ((a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0))

    {
        return true;
    }
    return false;
}

void main()

{

         Mat img = imread(".//1.jpg");

         Point A=Point (738,474);

         Point B=Point (449,677);

         Point C=Point (873,465);

         Point D=Point (1058,668);

         int x_min=min(min(A.x,B.x),min(C.x,D.x));

         int x_max=max(max(A.x,B.x),max(C.x,D.x));

         int y_min=min(min(A.y,B.y),min(C.y,D.y));

         int y_max=max(max(A.y,B.y),max(C.y,D.y));

         for(int i=x_min;i<x_max;i++)

           {

              for(int j=y_min;j<y_max;j++)

                 {

                        if(isPointInRect(i,j,A,B,C,D))

                        {

                                img.at<Vec3b>(i,j)[0]=img.at<Vec3b>(i,j)[0]*0.5+0*0.5;//黄色RGB值为(255,255,0),可修改其他颜色

                                img.at<Vec3b>(i,j)[1]=img.at<Vec3b>(i,j)[1]*0.5+255*0.5;//  0.5为颜色透明度,可调节

                                img.at<Vec3b>(i,j)[2]=img.at<Vec3b>(i,j)[2]*0.5+255*0.5;

                        }

                 }

           }

      imshow("img",img);

       waitKey(0);

}


最后上一张效果图

 

图像中不规则四边形区域用其他颜色覆盖,并可修改其透明度

    代码下载链接:https://download.csdn.net/download/qq_33740700/10619477

   上述文字及代码是本人亲手敲上去的,不对的地方请指正,希望对各位有帮助,欢迎大家跟我交流。

    转载记得加上原链接,谢谢~