OpenCV: случайные артефакты альфа-канала при наложении изображений с прозрачностью в iOS

c++ ios opencv

282 просмотра

1 ответ

1304 Репутация автора

В моем проекте iOS я добавляю небольшие изображения PNG, включая альфа-канал, в качестве наложения на изображение JPEG. Результат на моем устройстве в режиме отладки, как и ожидалось, слезы нарисованы правильно.

iOS Result Режим отладки

Когда я запускаю тот же код на симуляторе или когда я архивирую и экспортирую приложение в режиме RELEASE, я получаю случайные артефакты в альфа-канале.

Результат iOS на симуляторе и режим RELEASE

Базовый cv :: Mat содержит информацию заголовка и корректный раздел данных. Даже на зеленом фоне ошибка воспроизводима.

введите описание изображения здесь

Поведение кажется совершенно случайным, так как время от времени артефакты не рисуются (изображение 3: слеза справа, изображение 4: слеза слева). введите описание изображения здесь

Идеи, кто-нибудь?

Автор: ehrpaulhardt Источник Размещён: 19.07.2016 08:56

Ответы (1)


0 плюса

80 Репутация автора

const char *cpath1 = [@"" cStringUsingEncoding:NSUTF8StringEncoding];//overlay image path , within @"" pass your image path which is in NSString

const char *cpath  = [@"" cStringUsingEncoding:NSUTF8StringEncoding];//underlay imagepath

    cv::Mat overlay = cv::imread(cpath1,-1);//-1 is for read .png images
    cv::Mat underlay = cv::imread(cpath,-1);

    //convert mat image in to RGB channel
    cv::Mat overlayAlpha;
    std::vector<Mat> channels1;
    split(overlay, channels1);
    channels1[3].copyTo(overlayAlpha);

    cv::Mat underlayAlpha;
    std::vector<Mat> channels2;
    split(underlay, channels2);
    channels2[3].copyTo(underlayAlpha);

    overlayImage( &underlay, &overlay,cv::Point(10,10);

    convert final image to RGB channel
    cv::split(underlay,channels1);

    std::swap(channels1[0],channels1[2]);// swap B and R channels.
    cv::merge(channels1,underlay);//merge channels

    MatToUIImage(background); //display your final image, it returns cv::Mat image

и функция наложения, как показано ниже

ссылка на функцию наложения по адресу : http://answers.opencv.org/question/73016/how-to-overlay-an-png-image-with-alpha-channel-to-another-png/

void overlayImage(Mat* src, Mat* overlay, const cv::Point& location){

for (int y = max(location.y, 0); y < src->rows; ++y)
{
    int fY = y - location.y;

    if (fY >= overlay->rows)
        break;

    for (int x = max(location.x, 0); x < src->cols; ++x)
    {
        int fX = x - location.x;

        if (fX >= overlay->cols)
            break;

        double opacity = ((double)overlay->data[fY * overlay->step + fX * overlay->channels() + 3]) / 255;

        for (int c = 0; opacity > 0 && c < src->channels(); ++c)
        {
            unsigned char overlayPx = overlay->data[fY * overlay->step + fX * overlay->channels() + c];
            unsigned char srcPx = src->data[y * src->step + x * src->channels() + c];
            src->data[y * src->step + src->channels() * x + c] = srcPx * (1. - opacity) + overlayPx * opacity;
        }
    }
}
}
Автор: Dharini Размещён: 26.11.2016 11:40
Вопросы из категории :
32x32