iOS: как нарисовать цветовой контур с помощью OpenCV

Я работаю над приложением для iPhone, которое должно определить объект синего цвета из предварительного просмотра и изменить его на желтый цвет с помощью API drawcontour. Я много пробовал, но контур нарисован белым цветом. Я много искал, но не мог решить свою проблему. Мой код как следует:

- (void)viewDidLoad {
   [super viewDidLoad];    
   self->videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView];
   self->videoCamera.delegate = self;
   self->videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
   self->videoCamera.defaultAVCaptureSessionPreset =
   AVCaptureSessionPreset352x288;
   self->videoCamera.defaultAVCaptureVideoOrientation =
   AVCaptureVideoOrientationPortrait;
   self->videoCamera.grayscaleMode = NO;
   self->videoCamera.defaultFPS = 30;    
   [videoCamera start];
}

Делегировать, чтобы получить кадры:

-(void)processImage:(cv::Mat &)image
{
    cv::Mat image_copy = [self convertToYellow:image];       
}

Метод конвертации

- (cv::Mat)convertToYellow:(cv::Mat)image
{    
cv::Mat cameraFeed = image;
cv::Mat HSV, threshold;
cv::cvtColor(cameraFeed, HSV, CV_BGR2HSV);    
cv::inRange(HSV, cvScalar(90,50,50), cvScalar(130,255,255), threshold);

cv::Mat erodeElement = getStructuringElement( cv::MORPH_RECT,    cvSize(3,3));
//dilate with larger element so make sure object is nicely visible
cv::Mat dilateElement = getStructuringElement(  cv::MORPH_RECT,cvSize(3,3));

erode(threshold,threshold,erodeElement);
erode(threshold,threshold,erodeElement);

dilate(threshold,threshold,dilateElement);
dilate(threshold,threshold,dilateElement);   

cv::Mat temp;
threshold.copyTo(temp);
cv::vector< cv::vector<cv::Point> > contours;
cv::vector<cv::Vec4i> hierarchy;

findContours( temp, contours, hierarchy, CV_RETR_EXTERNAL,  CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );

bool objectFound = false;
if (hierarchy.size() > 0) {

    for (int index = 0; index >= 0; index = hierarchy[index][0]) {

        cv::Moments moment = moments((cv::Mat)contours[index]);
        double area = moment.m00;


        if(area > 500){

            objectFound = true;

        }else objectFound = false;
    }

    //let user know you found an object
    if(objectFound ==true){

        for(int i=0; i < contours.size() ; i++)
        {      
                    cv::drawContours(cameraFeed,contours,i,cvScalar(0,255,255),CV_FILLED);

        }

    }

}

return cameraFeed;

}

Актуальный объект

Актуальный объект

После того, как контур нарисован

предварительный просмотр после прорисовки контура

Кто-нибудь, пожалуйста, помогите в этом. заранее спасибо

0 ответов

Другие вопросы по тегам