2016-04-23 24 views
1

我的问题是针对Opencv专家,我检测到了路线(左和右线),所以我的目标是用半透明蓝色绘制道路区域。所以我用:poly opencv semi-transperent

cv::fillPoly(image, ppt, npt, 1, CV_RGB(0, 0,200), lineType); 

ppt-包含右点,左, 点

但是,我得到了它充满面积超过这不是我的目标的道路npt-数。

所以,我的问题是有没有解决方案绘制半透明的道路区域?我被告知添加另一个频道,如:

cv::Mat channel[3]; 
split(image, channel); 
    channel[0] = cv::Mat::zeros(image.rows, image.cols, CV_8UC1); 
    merge(channel, 3, image);cv::imshow("kkk",image); 

但事情是我得到了半透明的所有图像,我只想要道路区域。任何想法赞赏!

感谢

+0

漆聚对与黑色背景的单独图像。那么对于每个像素:如果多图像像素不是黑色:图像像素= 0.5 *图像像素+0.5 *多图像像素。而不是0.5你可以使用任何透明度因子x和(1-x) – Micka

+0

嗨米卡,非常感谢你的宝贵答复。我在哪里可以使用图像像素?有没有什么功能输出图像像素?我很感激,如果你可以给一些代码段? – Adam

回答

0

尝试这个代码(想不出测试它的移动):

cv::Mat polyImage = cv::Mat(image.rows, image.cols, CV_8UC3,cv::Scalar (0,0,0)); 
cv::fillPoly(polyImage, ppt, npt, 1, CV_RGB(0, 0,200), lineType); 

float transFactor = 0.5f; // the bigger the more transparent 

for(int y=0;y <image.rows;++y) 
    for(int x=0;x <image.cols; ++x) 
    { 
     if(polyImage.at<cv::Vec3b>(y,x) != cv::Vec3b(0,0,0)) 
      image.at<cv::Vec3b>(y,x) = (transFactor)*image.at<cv::Vec3b>(y,x) + (1.0f - transFactor)*polyImage.at<cv::Vec3b>(y,x); 
    } 
+0

感谢Micka的回复,这真的很有帮助。我只有一个问题 。首先我在这一行中出现错误:image.at (y,x)= transFactorimage.at +(1.0f - transFactor)* polyImage.at (y,x);它说:错误C3867:'cv :: Mat :: at':函数调用缺少参数列表;使用'&cv :: Mat :: at'来创建指向成员的指针 - 所以当我试图编辑时:image.at (y,x)= transFactorimage.at +(1.0f - transFactor)* polyImage.at (y,x); ///它可以工作,但相反,图像是黑暗的,检测到的区域是真实的图像,非常感谢 – Adam

+0

对不起,有一个语义错误。再试一次!我从==改为!= – Micka

+0

是的,我知道了,非常感谢Micka :) – Adam