2015-11-07 109 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