2016-12-12 3 views
0

Я новичок в Обработка и обработка изображений. Мне нужно взять внутренние треугольные пиксели изображения. Для этого я использовал следующий код. К сожалению, я получаю нежелательные черные пиксели. избавиться от этой проблемы, я попытался удалить фоновые [0] пиксели, указав значение alfa. (tranparent background) Но он дает следующую ошибку. Любая помощь приветствуется.Извлечь пиксели изображения треугольника Ошибка

Мой код:

Mat img = cv::imread("/home/fabio/code/lena.jpg", cv::IMREAD_GRAYSCALE); 

Mat alpha(img.size(), CV_8UC1, Scalar(0)); 

//triangle definition (example points) 
vector<Point> points; 
points.push_back(Point(200, 70)); 
points.push_back(Point(60, 150)); 
points.push_back(Point(500, 500)); 

//apply triangle to mask 
fillConvexPoly(alpha, points, Scalar(255)); 

cv::Mat finalImage = cv::Mat::zeros(img.size(), img.type()); 

img.copyTo(finalImage, alpha); 

imshow("image", finalImage); 

Mat dst; 

Mat rgb[1]; 
split(finalImage, rgb); 
Mat rgba[2] = { finalImage, alpha }; 
merge(rgba, 2, dst); 

imshow("dst", dst); 

Ошибка: OpenCV Error: Bad количество каналов (Исходное изображение должно иметь 1, 3 или 4 канала) в cvConvertImage, файл C: \ строит \ 2_4_PackSlave-Win64-VC12 -shared \ OpenCV \ модули \ highgui \ SRC \ utils.cpp, строка 611

What i need to do

+0

Ваше входное изображение загружается как оттенки серого, поэтому это не RGB, а только один канал. Добавление альфа-канала достигнет 2-канального изображения, которое невозможно отобразить. Имейте в виду, что openCV не будет корректно обрабатывать альфа-канал во время отображения с помощью imshow, поэтому лучше сохранить как .png, чтобы проверить функцию альфа-канала. – Micka

ответ

1

использовать это вместо последнего блока:

std::vector<cv::Mat> channels; 
cv::split(finalImage,m channels); 
if(channels.size() == 0) 
{ 
    std::cout << "unexpected error" << std::endl; 
    return 1; 
} 
// fill up to reach 3 channels 
while(channels,size() < 3) 
{ 
    channels.push_back(channels[0]); 
} 
// add alpha channel 
channels.push_back(alpha); 
cv::merge(channels, dst); 

Я не тестировал его, но это должно быть то, что вы хотите?

+0

не видел, чтобы ваше входное изображение было в оттенках серого ... добавлено больше каналов, если необходимо, чтобы добраться до RGBA. – Micka

+1

@ Мика, вы идете, я думаю, правильно, спасибо за так много. Но код имеет небольшую проблему. \t 'no instance of overloaded function" merge "соответствует списку аргументов Типы аргументов: (std :: vector >, int, cv :: Mat) \t c: \ Users \ ven \ Documents \ Visual Studio 2013 \ Projects \ current_final \ opencvtest \ opencvtest.cpp \t 230' – Alan

+0

исправил код (надеюсь)! – Micka

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