2016-04-23 5 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

окрасить поли в виде отдельного изображения с черным фоном. то для каждого пикселя: если polyimage-pixel isnt black: image-pixel = 0.5 * imagepixel + 0.5 * polyimage-pixel. вместо 0.5 вы можете использовать любой коэффициент прозрачности x и (1-x) – Micka

+0

Привет Мика, большое спасибо за ценный ответ. где я могу использовать пиксель изображения? есть ли какая-либо функция для вывода пикселя изображения? Я ценю, если вы можете дать некоторый сегмент кода? – Adam

ответ

0

попробовать этот код (Couldnt тест его на мобильный):

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

благодарит Микку за ответ, это было действительно полезно. У меня только один вопрос . Сначала я получил ошибку в этой строке: image.at (y, x) = transFactorimage.at + (1.0f - transFactor) * polyImage.at (y, x); это говорит о том, что: ошибка C3867: 'cv :: Mat :: at': вызов функции отсутствует список аргументов; use '& cv :: Mat :: at' для создания указателя на член - поэтому, когда я пытался редактировать: image.at (y, x) = transFactorimage.at + (1.0f - transFactor) * polyImage.at (y, x); /// это работает, но наоборот, изображение темное, а обнаруженная область - реальное изображение, спасибо большое – Adam

+0

да извините, была семантическая ошибка. Попробуй еще раз! Я изменился с == на! = – Micka

+0

да, я получил его, спасибо много Мика :) – Adam

 Смежные вопросы

  • Нет связанных вопросов^_^