2016-04-23 1 views
1

Ma question s'adresse aux experts d'Opencv, j'ai détecté des lignes de route (lignes gauche et droite) alors je visais à peindre la zone de la route avec du bleu semi-transparent. Alors je:poly opencv semi-transperent

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

ppt- contiennent les points à droite et à gauche, nombre de points

TNP,

Mais, ce que je l'ai eu zone remplie sur la route qui n'est pas mon but.

Donc, ma question est là une solution pour peindre la zone de la route avec semi-transparent? On m'a dit d'ajouter un autre canal comme:

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

Mais la chose est que je suis toute l'image semi-transparente et je ne veux que la zone de la route. Toutes les idées ont apprécié !!

grâce

+0

peindre le poly à une image distincte avec un fond noir. puis pour chaque pixel: si le pixel de polyimage n'est pas noir: image-pixel = 0.5 * imagepixel + 0.5 * polyimage-pixel. au lieu de 0.5 vous pouvez utiliser n'importe quel facteur de transparence x et (1-x) – Micka

+0

Salut Micka, merci beaucoup pour la réponse précieuse. Où puis-je utiliser l'image-pixel? Y a-t-il une fonction pour produire un pixel d'image? j'apprécie si vous pouvez donner un segment de code? – Adam

Répondre

0

essayer ce code (test ne pouvions pas sur le mobile):

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

remercie Micka pour la réponse, c'était vraiment utile. J'ai juste une question . J'ai d'abord eu une erreur dans cette ligne: image.at (y, x) = transFactorimage.at + (1.0f - transFactor) * polyImage.at (y, x); il dit que: erreur C3867: 'cv :: Mat :: at': appel de fonction manquant liste d'arguments; utilisez '& cv :: Mat :: at' pour créer un pointeur sur member-- alors quand j'ai essayé d'éditer: image.at (y, x) = transFactorimage.at + (1.0f - transFactor) * polyImage.at (y, x); /// ça marche mais dans le sens inverse, l'image est sombre et la zone détectée est l'image réelle, merci beaucoup – Adam

+0

oui désolé, il y avait une erreur sémantique. Réessayer! J'ai changé de == à! = – Micka

+0

oui je l'ai eu, merci beaucoup Micka :) – Adam