2016-04-02 16 views
0

私のような同様の質問がすでに掲載されていましたが、私の現在の問題に適合しない部分があります。 Xcode とObjective C++を使ってopenCVを扱いました。OpenCV - 等高線の境界ボックスと円を作成する - Xcode [Objective-C++]

私がしたいことは、写真の人間の目の周りにいくつかの境界ボックスと円を作成することです。私は、次のコードを使用しているが、これは動作しません:

-(void)detectEye { 

cv::Mat src_gray; 
int thresh = 100; 
RNG rng(12345); 

NSString *path = @"/Users/NazarMedeiros/Desktop/image.jpg"; 

cv::Mat src = cv::imread("/Users/NazarMedeiros/Downloads/face.jpg"); 
if (src.empty()) 
    return; 

cv::cvtColor(src, src_gray, CV_BGR2GRAY); 
cv::blur(src_gray, src_gray, cv::Size(3,3)); 

cv::Mat threshold_output; 
std::vector<std::vector<cv::Point> > contours; 
std::vector<Vec4i> hierarchy; 

/// Detect edges using Threshold 
cv::threshold(src_gray, threshold_output, thresh, 255, THRESH_BINARY); 
/// Find contours 
cv::findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0)); 

/// Approximate contours to polygons + get bounding rects and circles 
std::vector<std::vector<cv::Point> > contours_poly(contours.size()); 
std::vector<cv::Rect> boundRect(contours.size()); 
std::vector<Point2f>center(contours.size()); 
std::vector<float>radius(contours.size()); 

for(int i = 0; i < contours.size(); i++) { 
    cv::approxPolyDP(cv::Mat(contours[i]), contours_poly[i], 3, true); 
    boundRect[i] = cv::boundingRect(cv::Mat(contours_poly[i])); 
    cv::minEnclosingCircle((cv::Mat)contours_poly[i], center[i], radius[i]); 
} 

/// Draw polygonal contour + bonding rects + circles 
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3); 
for(int i = 0; i < contours.size(); i++) { 
    cv::Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
    cv::drawContours(drawing, contours_poly, i, color, 1, 8, std::vector<Vec4i>(), 0, cv::Point()); 
    cv::circle(drawing, center[i], (int)radius[i], color, 2, 8, 0); 
} 
imwrite([path UTF8String], src);} 

} 関数imwrite機能は、

誰も私を助けることができる...私のイメージをしてください保存しませんか? 敬具、 ナザールメデイロス

+1

てみUIImageに "描画" に変換してください。 UIImage * image = MatToUIImage(img); –

答えて

1

CV ::マットIMGを変更する

- (UIImage *)UIImageFromCVMat:(cv::Mat)cvMat 
{ 
    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize()*cvMat.total()]; 
    CGColorSpaceRef colorSpace; 

    if (cvMat.elemSize() == 1) { 
     colorSpace = CGColorSpaceCreateDeviceGray(); 
    } else { 
     colorSpace = CGColorSpaceCreateDeviceRGB(); 
    } 

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

    // Creating CGImage from cv::Mat 
    CGImageRef imageRef = CGImageCreate(cvMat.cols,         //width 
             cvMat.rows,         //height 
             8,           //bits per component 
             8 * cvMat.elemSize(),      //bits per pixel 
             cvMat.step[0],       //bytesPerRow 
             colorSpace,         //colorspace 
             kCGImageAlphaNone|kCGBitmapByteOrderDefault,// bitmap info 
             provider,         //CGDataProviderRef 
             NULL,          //decode 
             false,          //should interpolate 
             kCGRenderingIntentDefault     //intent 
             ); 


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

    return finalImage; 
} 
関連する問題