2014-09-22 2 views
0

Я пытаюсь изменить значения глубины глубины карты глубины, используя описанный метод here. Чтобы подвести итог метода:Картинка глубины рисунка, по-прежнему черная рамка изображения

  1. DOWNSIZE карта глубины до 20% от первоначального размера
  2. Inpaint всех черных (неизвестные) пиксели в сокращенных изображениях
  3. укрупняются к исходному размеру
  4. Заменить все черные пиксели в исходное изображение с соответствующими значениями из-за повышенного изображения

Супер простой и все работает хорошо. Видео, показывающее результаты, можно найти here.

Однако, мне интересно, почему левая и верхняя граница изображения по-прежнему остаются черными, хотя их нужно разрисовывать (можно увидеть в видео). Моя первая мысль заключалась в том, что это могло бы что-то сделать с интерполяцией границы (черные пиксели вне границы изображения), но я ожидаю, что это также произойдет на других границах изображения. Моя вторая мысль заключалась в том, что это нечто специфичное для используемого метода inpainting (метод Alexandru Telea), но изменение его на метод Navier-Stokes не изменило результаты.

Может ли кто-нибудь объяснить мне, почему это происходит, и как сообщить OpenCV о том, чтобы, по возможности, также освещать эти регионы?

Заранее спасибо.

+0

вероятно значения на левой стороне не 255? можете ли вы добавить другое окно, которое отображает все значения глубины, равные 255 в глубине? например 'cv :: imshow (" newWindowName ", depthf == 255);' Если это причина, вы можете изменить использованную маску на '> 250' или что-то вместо' == 255' в строках 13 и 16 связанного кода , – Micka

+0

Поскольку я получаю неизвестные значения глубины как 0, для меня это будет depthf == 0 или depthf> 5, но в любом случае вот несколько изображений: [Это] (https://drive.google.com/file/d/ 0B-qt8lafqDaeQy03QndSMkUxUkU/edit? Usp = sharing) показывает пример карты глубины. [Это] (https://drive.google.com/file/d/0B-qt8lafqDaeZUNOdVBNMlNLcXc/edit?usp=sharing) - это маска, используемая для inpainting. И [это] (https://drive.google.com/file/d/0B-qt8lafqDaeSi01cmJDc3Byc1U/edit?usp=sharing) является результатом.Любые идеи @ Мика? Левая граница как-то странная, но позволяет придерживаться верхней границы. Он явно включен в маску. – thomas

+0

Вы посмотрели _tmp1 и _tmp? – Micka

ответ

2

По просьбе @theodore в http://answers.opencv.org/question/86569/inpainting-depth-map-still-black-image-borders/?comment=86587#comment-86587 Я использовал образцы изображений, чтобы проверить поведение inpaint. Похоже, что он неправильно обрабатывает границу, поэтому можно создать границу с cv::copyMakeBorder.

Вот расширенная версия с какой-то модульного тестирования:

int main(int argc, char* argv[]) 
{ 
    cv::Mat input = cv::imread("C:/StackOverflow/Input/depthInpaint.png"); 
    cv::Mat img; 
    cv::cvtColor(input, img, CV_BGR2GRAY); 

    cv::Mat inpainted; 
    const unsigned char noDepth = 0; // change to 255, if values no depth uses max value or use the mask image 
    //cv::inpaint(img, (img == noDepth), depth, 5.0, cv::INPAINT_TELEA); // img is the 8-bit input image (depth map with blank spots) 


    double inpaintRadius = 5; 
    int makeBorder = 1; 
    cv::Mat borderimg; 
    cv::copyMakeBorder(img, borderimg, makeBorder, makeBorder, makeBorder, makeBorder, cv::BORDER_REPLICATE); 
    cv::imshow("border", borderimg); 
    cv::inpaint(borderimg, (borderimg == noDepth), inpainted, inpaintRadius, cv::INPAINT_TELEA); // img is the 8-bit input image (depth map with blank spots) 

    cv::Mat originalEmbedded = borderimg(cv::Rect(makeBorder, makeBorder, img.cols, img.rows)); 
    cv::Mat inpaintedEmbedded = inpainted(cv::Rect(makeBorder, makeBorder, img.cols, img.rows)); 


    cv::Mat diffImage; 
    cv::absdiff(img, originalEmbedded, diffImage); 
    cv::imshow("embedding correct?", diffImage > 0); 

    cv::Mat mask = img == noDepth; 
    cv::imshow("mask", mask); 


    cv::imshow("input", input); 
    cv::imshow("inpainted", inpainted); 
    cv::imshow("inpainted from border", inpaintedEmbedded); 
    cv::waitKey(0); 
    return 0; 
} 

Вот сокращенный вариант, если вы считаете, что это правильно:

int main(int argc, char* argv[]) 
{ 
    cv::Mat input = cv::imread("C:/StackOverflow/Input/depthInpaint.png"); 
    cv::Mat img; 
    cv::cvtColor(input, img, CV_BGR2GRAY); 

    cv::Mat inpainted; 
    const unsigned char noDepth = 0; // change to 255, if values no depth uses max value or use the mask image 
    //cv::inpaint(img, (img == noDepth), depth, 5.0, cv::INPAINT_TELEA); // img is the 8-bit input image (depth map with blank spots) 

    double inpaintRadius = 5; 
    int makeBorderSize = 1; 
    cv::Mat borderimg; 
    //cv::copyMakeBorder(img, borderimg, borderSize, borderSize, borderSize, borderSize, cv::BORDER_REPLICATE); 
    cv::copyMakeBorder(img, borderimg, makeBorderSize, makeBorderSize, makeBorderSize, makeBorderSize, cv::BORDER_REPLICATE); 
    //cv::imshow("border", borderimg); 
    cv::inpaint(borderimg, (borderimg == noDepth), inpainted, inpaintRadius, cv::INPAINT_TELEA); // img is the 8-bit input image (depth map with blank spots) 

    // extract the original area without border: 
    cv::Mat inpaintedEmbedded = inpainted(cv::Rect(makeBorderSize, makeBorderSize, img.cols, img.rows)); 



    cv::imshow("input", input); 
    cv::imshow("inpainted from border", inpaintedEmbedded); 
    cv::waitKey(0); 
    return 0; 
} 

Вот вход:

enter image description here

Вот вход с рамкой (borderiz е 5 визуализировать эффект лучше):

enter image description here

Вот результат:

enter image description here

+0

большое спасибо за ответ ;-). К сожалению, я не могу отметить это как решение, так как только стартер потока может, но у вас есть мой upvote. Еще раз спасибо. – ThT

+0

да, я знаю, thx. Это не прямое решение вопроса о запуске нитей, поскольку он не опубликовал свой код, но, вероятно, ему тоже помогла бы такая же механика. Получайте удовольствие и, пожалуйста, ответьте или обновите свой вопрос на веб-сайте OpenCV с помощью решения. – Micka

+0

yup Я буду, думаю, я также открою вопрос в github ;-) – ThT

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