МОЙ ТЕКУЩИЙ РЕЗУЛЬТАТ ------ ЖЕЛАЕМЫЙ ВЫХОД . Я создаю мобильное приложение, которое позволяет пользователям выбирать цвет из палитры и цветовые части трехмерного изображения, такие как комната или стена.
В настоящее время я использую 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;
}
Я ожидаю, что цвет на стене будет похож на некоторый уровень гладкости и прозрачности. Но мой вывод заливки содержит дыры, и он не работает, когда свет яркий.