2015-11-07 57 views
0

我有一些簡單的代碼執行Canny邊緣檢測並覆蓋原始圖像上的邊緣。覆蓋在圖像上的canny邊緣黑色

該代碼有效,但我希望邊緣被繪製成黑色,目前它們被繪製成白色。

static void sketchImage(Mat srcColor, Mat& dst, bool sketchMode, int debugType) 
{ 
    Mat srcGray; 
    Mat edgesBgr; 
    cvtColor(srcColor, srcGray, CV_BGRA2GRAY); 
    cvtColor(srcColor, srcColor, CV_BGRA2BGR); 

    GaussianBlur(srcGray, srcGray, cvSize(5, 5),1.2,1.2); 
    GaussianBlur(srcColor, srcColor, cvSize(5,5), 1.4, 1.4); 

    CvSize size = srcColor.size(); 
    Mat edges = Mat(size, CV_8U); 

    Canny(srcGray, edges, 150, 150); 

    cvtColor(edges, edgesBgr, cv::COLOR_GRAY2BGR); 

    dst = srcColor + edgesBgr; 
} 

我敢肯定這很簡單,但我相當新的openCV,我會很感激任何幫助。根據要求

全碼:

#import "ViewController.h" 
#import "opencv2/highgui.hpp" 
#import "opencv2/core.hpp" 
#import "opencv2/opencv.hpp" 
#import "opencv2/imgproc.hpp" 

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UIImageView *display; 
@property (strong, nonatomic) UIImage* image; 
@property (strong, nonatomic) UIImage* backup; 
@property NSInteger clickflag; 
@end 

@implementation ViewController 

using namespace cv; 

- (IBAction)convert_click:(id)sender { 

NSLog(@"Clicked"); 
if (_clickflag == 0) 
{ 
    cv::Mat cvImage, cvBWImage; 
    UIImageToMat(_image, cvImage); 
    //cv::cvtColor(cvImage, cvBWImage, CV_BGR2GRAY); 

    //cvBWImage = cvImage; 
    cartoonifyImage(cvImage, cvBWImage, false, 0); 

    _image = MatToUIImage(cvBWImage); 
    [_display setImage:_image]; 
    _clickflag = 1; 
} 
else if(_clickflag == 1) 
{ 
    _image = _backup; 
    [_display setImage:_image]; 
    _clickflag = 0; 
} 


} 



static UIImage* MatToUIImage(const cv::Mat& m) 
{ 
//CV_Assert(m.depth() == CV_8U); 
NSData *data = [NSData dataWithBytes:m.data length:m.step*m.rows]; 
CGColorSpaceRef colorSpace = m.channels() == 1 ? 
CGColorSpaceCreateDeviceGray() : CGColorSpaceCreateDeviceRGB(); 
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 

// Creating CGImage from cv::Mat 
CGImageRef imageRef = CGImageCreate(m.cols, m.rows, m.elemSize1()*8, m.elemSize()*8, 
            m.step[0], colorSpace, kCGImageAlphaNoneSkipLast|kCGBitmapByteOrderDefault, 
            provider, NULL, false, kCGRenderingIntentDefault); 
UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 
CGDataProviderRelease(provider); 
CGColorSpaceRelease(colorSpace); 
return finalImage; 
} 

static void UIImageToMat(const UIImage* image, cv::Mat& m) 
{ 
CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); 
CGFloat cols = image.size.width; 
CGFloat rows = image.size.height; 

m.create(rows, cols, CV_8UC4); // 8 bits per component, 4 channels 
CGContextRef contextRef = CGBitmapContextCreate(m.data, m.cols, m.rows, 8, 
               m.step[0], colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrderDefault); 
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), image.CGImage); 
CGContextRelease(contextRef); 

} 

static void sketchImage(Mat srcColor, Mat& dst, bool sketchMode, int debugType) 

{

Mat srcGray; 
Mat edgesBgr; 

cvtColor(srcColor, srcGray, CV_BGRA2GRAY); 
cvtColor(srcColor, srcColor, CV_BGRA2BGR); 

GaussianBlur(srcGray, srcGray, cvSize(5, 5),1.2,1.2); 
GaussianBlur(srcColor, srcColor, cvSize(5,5), 1.4, 1.4); 

CvSize size = srcColor.size(); 
Mat edges = Mat(size, CV_8U); 

Canny(srcGray, edges, 150, 150); 

cvtColor(edges, edgesBgr, cv::COLOR_GRAY2BGR); 
//edgesBgr = edgesBgr.inv(); 
NSLog(@"%d, %d\n", srcColor.size().height, srcColor.size().width); 
NSLog(@"%d, %d\n", edgesBgr.size().height, edgesBgr.size().width); 

dst = edgesBgr + srcColor; 
} 




- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

_image = [UIImage imageNamed:@"Robben.jpg"]; 
_backup = [UIImage imageNamed:@"Robben.jpg"]; 
_clickflag = 0; 

[_display setImage:_image]; 

} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

@end 
+0

試srcColor.setTo(CV ::標量(0,0,0),邊緣) 。 (使用邊緣mat作爲.setTo方法的掩碼)http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat-setto – Micka

回答

2
static void sketchImage(Mat srcColor, Mat& dst, bool sketchMode, int debugType) 
{ 
    Mat srcGray; 

    cvtColor(srcColor, srcGray, CV_BGRA2GRAY); 
    cvtColor(srcColor, srcColor, CV_BGRA2BGR); 

    GaussianBlur(srcGray, srcGray, cvSize(5, 5),1.2,1.2); 
    GaussianBlur(srcColor, srcColor, cvSize(5,5), 1.4, 1.4); 

    CvSize size = srcColor.size(); 
    Mat edges = Mat(size, CV_8U); 

    Canny(srcGray, edges, 150, 150); 

    dst = srcColor.clone(); 
    dst.setTo(0,edges); 
} 
2

您可以應用bitwise_not(dst,dst)使白色變成了黑色和黑色變成白色!

空隙bitwise_not(InputArray SRC,OutputArray DST,InputArray 掩模= noArray())

+0

感謝您的建議,但是當我嘗試所得結果'dst'圖像全是白色,邊緣顏色爲 – James

+0

嗡嗡聲你確定你的邊緣沒有着色,即使沒有bitwise_not?我會嘗試你的代碼 – coincoin

+0

@ Kells1986你能否提供一個簡單的main()來代表你的問題? – coincoin