3D-изображение Flood Fill в iOS-приложении выдает непоследовательный результат заполнения - PullRequest
1 голос
/ 18 июня 2019

МОЙ ТЕКУЩИЙ РЕЗУЛЬТАТ ------ ЖЕЛАЕМЫЙ ВЫХОД . Я создаю мобильное приложение, которое позволяет пользователям выбирать цвет из палитры и цветовые части трехмерного изображения, такие как комната или стена.

В настоящее время я использую Opencv для iOS. Я создал категорию для UIImage, которая заполняет от точки, выбранной пользователем, до ближайшего изменения цвета. Я знаю, что эта проблема требует дальнейшей обработки.

- (UIImage *)floodFillFromPoint:(cv::Mat)cvMat startPoint:(NSMutableArray* )startPoint endPoint:(NSMutableArray* )endPoint newColor:(ColorsRGB *)newcolor lodiff:(int )diff tap:(int )Taps
{
    cv::Mat cvMat2 = cvMat.clone();

    cv::cvtColor(cvMat, cvMat, cv::COLOR_BGR2RGB);//in-use

    cv::Mat mask;
    cv:: Mat edges;
    edges = cv::Mat::zeros(500, 500, CV_8UC1);
    cv::resize(cvMat, cvMat, cv::Size(500, 500));


    cv::Mat grad_x,grad_y,abs_grad_x,abs_grad_y;

        cv::Sobel(cvMat, grad_x, CV_16S, 1, 0);
        cv::Sobel(cvMat, grad_y, CV_16S, 0, 1);


    cv::Canny(grad_x, grad_y,edges, 25, 70,3);

    cv::resize(edges, edges, cv::Size(500 + 2, 500 + 2));

    for (Pointed* obj in startPoint)
    {



        cv::Point seed(obj.point1,obj.point2);
        double red  = 255.0 * newcolor.red;
        double green  = 255.0 * newcolor.green;
        double blue  = 255.0 * newcolor.blue;

       cv::floodFill(cvMat,edges,seed, cv::Scalar(red,green,blue) ,0, cv::Scalar(2,2,2),cv::Scalar(1,1,1),4);



    }


    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()];

    CGColorSpaceRef colorSpace;
    CGBitmapInfo bitmapInfo;

    if (cvMat.elemSize() == 1) {
        colorSpace = CGColorSpaceCreateDeviceGray();
        bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
    } else {
        colorSpace = CGColorSpaceCreateDeviceRGB();
        bitmapInfo = kCGBitmapByteOrder32Little | (
                                                   cvMat.elemSize() == 3? kCGImageAlphaNone : kCGImageAlphaNoneSkipFirst
                                                   );
    }

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

    // Creating CGImage from cv::Mat
    CGImageRef imageRef = CGImageCreate(
                                        cvMat.cols,                 
                                        cvMat.rows,                 
                                        8,                          
                                        8 * cvMat.elemSize(),       
                                        cvMat.step[0],              
                                        colorSpace,                 
                                        bitmapInfo,                 
                                        provider,                   
                                        NULL,                      
                                        false,                      
                                        kCGRenderingIntentDefault
                                        );

    // Getting UIImage from CGImage
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);


    return finalImage;
}

Я ожидаю, что цвет на стене будет похож на некоторый уровень гладкости и прозрачности. Но мой вывод заливки содержит дыры, и он не работает, когда свет яркий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...