2013-04-10 20 views
7

göstermiyorsunuz, bir elips çizmek için cv :: Skaler bir görüntü çerçevesi üzerinde beklenen renk

void ellipse(Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness=1, int lineType=8, int shift=0)

kullanmak ve yeşil enter image description here [RGB değerine elips rengini ayarlamak istiyorum: (165, 206 94)]. Bu yüzden de RGB alternatifi denedik

cv::Scalar(94.0, 206.0, 165.0, 0.0); // as BGR order, suppose the value is 0.0 - 255.0 
cv::Scalar(94.0/255.0, 206.0/255.0, 165.0/255.0, 0.0); // suppose the value is 0.0 - 1.0 

parametreyi const Scalar& color ayarlayın.

CV_RGB(165.0, 206.0, 94.0); // as RGB order, suppose the value is 0.0 - 255.0 
CV_RGB(165.0/255.0, 206.0/255.0, 94.0/255.0); // suppose the value is 0.0 - 1.0 

Ancak görüntülenen rengi beyaz enter image description here olan [RGB değeri (255, 255, 255)], arzu edilmeyen yeşil olan.

Bu noktada neleri özledim? Herhangi bir öneri lütfen. Teşekkür ederim.

DÜZENLEME:

beni burada bütün ilgili kod koyalım.

self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imgView]; 
[self.videoCamera setDelegate:self]; 
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront; 
self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288; 
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait; 
self.videoCamera.defaultFPS = 30; 
self.videoCamera.grayscaleMode = NO; 
[self.videoCamera adjustLayoutToInterfaceOrientation:UIInterfaceOrientationPortrait]; 

Sonra denilen [self.videoCamera start]; sonra, (Mat&)image yakalanan olacağını ve CvVideoCameraDelegate yönteminde - (void)processImage:(Mat&)image; işlenebilir ve burada bir elips çizmek için kod vardır:

OpenCV iOS - Video Processing göre bu - (void)viewDidLoad; içinde CvVideoCamera yapılandırma olduğunu
- (void)processImage:(Mat&)image { 

NSLog(@"image.type(): %d", image.type()); // got 24 

// image.convertTo(image, CV_8UC3); // try to convert image type, but with or without this line result the same 

NSLog(@"image.type(): %d", image.type()); // also 24 

cv::Scalar colorScalar = cv::Scalar(94, 206, 165); 
cv::Point center(image.size().width*0.5, image.size().height*0.5); 
cv::Size size(100, 100); 
cv::ellipse(image, center, size, 0, 0, 360, colorScalar, 4, 8, 0); 

}

Sonunda, elips beyaz değil, arzu edilen yeşil bir devam etmektedir.

+0

Kontrol senin kodun kalan kısmı ve başka bir yerde de renk değerini değiştirerek olmadığından emin olun. Sağladığınız bölüm, makinemde beklenen yeşil rengi mükemmel şekilde gösteriyor. – Barshan

+2

belki de float tipinde resminiz var mı? [0 1] değerleri var mı? – mrgloom

+0

@Barshan Das kontrol ettim ve hala aynı kod kalanını ancak rengini yorumladı ettik. Hangisi senin için çalışıyor? – Protocole

cevap

2

Açıklamada mrgloom doğru bir şekilde işaret ettiğinden, görüntünüzün türünden [Çizmek istediğiniz Mat nesnesi, yani Mat & img elips() işlevinde] kaynaklanabilir. cv :: Skaler (94, 206, 165), 8UC3 tipi görüntüler için istenen yeşil renktir. Bu değerleri 32FC3 görüntüsünde ayarlamak, beyaz renkte sonuçlanacaktır.

+0

. Image.type() = 24’üm var. Bu sonuç beyaz renkte 'cv :: Skaler (94, 206, 165)' yapar mı? Eğer öyleyse ne Mat görüntü türü Doğru yeşil rengini almak için dönüştürmek gerekir? Sadece src.convertTo (dst, ) kullanabilir miyim? Teşekkür ederim. – Protocole

+0

evet src'yi convertTo işleviyle dönüştürebilirsiniz. Src matrisini nasıl oluşturduğunuzu gösteren kodu gösterin. – Barshan

+0

Görüntü türünü şanssız dönüştürmeyi denedim. Lütfen basımdaki ilgili kodu inceleyin. Tekrar teşekkürler. – Protocole

1

Eğer

src.convertTo (src, CV_8UC3) kullanabilir;

CV_8UC3, 8 bit imzasız char ve 3 renkli görüntü temsili kullandığınız anlamına gelir. Daha fazla bilgi burada OpenCV docs sonra tüm kodun yayınlanmasına yardımcı olmazsa, elips yeşil olmalıdır.

+0

Cevabınızı başarılı olmadan denediniz. Lütfen basımdaki ilgili tüm kodları inceleyin. Teşekkür ederim. – Protocole

0

Benzer bir sorunla karşılaşıyordum ve ilk önce görüntüyü BGR'ye dönüştürerek düzeltmeyi başardım.Yani sizin durumda processImage fonksiyonu olarak görünecektir:

-(void)processImage:(Mat&)image 
{ 
    cvtColor(image, image, CV_RGBA2BGR); 
    cv::Scalar colorScalar = cv::Scalar(94, 206, 165); 
    cv::Point center(image.size().width*0.5, image.size().height*0.5); 
    cv::Size size(100, 100); 
    cv::ellipse(image, center, size, 0, 0, 360, colorScalar, 4, 8, 0); 
} 

Ben senin koduna eklediğiniz tek çizgidir:

cvtColor(image, image, CV_RGBA2BGR); 

ayrıca kanal, derinliği giriş yapıp yukarıdaki bilgileri yazarsanız fonksiyonu aşağıdaki gibidir:

: dönüşüm önce göreceksiniz
NSLog(@"Before conversion"); 
NSLog(@"channels %d", image.channels()); 
NSLog(@"depth %d", image.depth()); 
NSLog(@"type %d", image.type()); 
NSLog(@"element size %lu", image.elemSize()); 
cvtColor(image, image, CV_RGBA2BGR); 
NSLog(@"After conversion"); 
NSLog(@"channels %d", image.channels()); 
NSLog(@"depth %d", image.depth()); 
NSLog(@"type %d", image.type()); 
NSLog(@"element size %lu", image.elemSize()); 

Bence

CV_8UC4 ve dönüşümden sonra o olur: CV_8UC3

channels 3 
depth 0 
type 16 
element size 3 

olan.

CvtColor olmadan çalışmama nedenlerinden biri de tahminimce, opaka çizim işlevleri opencv documentation'da belirtildiği gibi hedef görüntü 4 kanallı olduğunda alfa saydamlığını desteklememesidir. Böylece CV_RGBA2BGR'yi dönüştürerek alfa kanalı çıkarırız. Ancak ben yaparsam o iş başardı yok söyledikten: Bu Kırmızı ve Mavi renklerde

cvtColor(image, image, CV_RGBA2RGB); 

görüntüde ters çevrilir. Bu yüzden işe yaradığı halde gerçek sebebin olup olmadığından emin değilim. 255

9

Seti alfa bu sorunu çözebilirsiniz. Skaler (94206165255)

+0

lütfen açıklayınız. – Irfan

+1

Bilmiyorum ama bu benim için çalıştı. – bakalolo

İlgili konular