2013-04-10 16 views
7

上的圖像幀,我用CV ::標量不顯示預期的顏色

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)

繪製一個橢圓,我想設置的橢圓顏色爲綠色enter image description here [RGB值:(165,206 ,94)]。 所以我的參數const Scalar& color設置爲

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 

我也試過RGB替代。

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 

但是正在顯示的顏色是白色enter image description here [RGB值(255,255,255)〕,而不是所期望的綠色之一。

我在這裏錯過了什麼?請提供任何建議。謝謝。

編輯:

讓我把整個相關的代碼在這裏。根據OpenCV iOS - Video Processing,這是CvVideoCamera配置在- (void)viewDidLoad;

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]; 

然後[self.videoCamera start];叫之後,(Mat&)image將被捕獲並可以在CvVideoCameraDelegate方法- (void)processImage:(Mat&)image;進行處理,這裏是繪製橢圓的代碼:

- (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); 

}

最終,橢圓仍處於白色,而不是所期望的綠色之一。

+0

檢查代碼的其餘部分,並確保不會在其他地方更改顏色值。您提供的部分完美地顯示了我機器中的預期綠色。 – Barshan 2013-04-10 05:45:38

+2

也許你有漂浮類型的圖像?哪些值[0 1]的值範圍? – mrgloom 2013-04-10 05:55:24

+0

@Barshan Das我已經檢查並評論了代碼的其餘部分,但顏色仍然相同。哪一個適合你? – Protocole 2013-04-10 06:19:11

回答

2

由於mrgloom在評論中指向正確,可能是因爲您的圖片的類型[您要繪製的Mat對象,即在橢圓()函數]中的圖像Mat &。 cv ::標量(94,206,165)是8UC3型圖像所需的綠色。在32FC3圖像中設置這些值將導致白色。

+0

對不起請澄清我。我有'image.type()= 24'。這是否導致白色的cv :: Scalar(94,206,165)? 如果是這樣,我應該轉換爲什麼Mat圖像類型以獲取正確的綠色?我可以使用'src.convertTo(dst,);'?謝謝。 – Protocole 2013-04-10 09:46:10

+0

是的,你可以通過convertTo函數來轉換src。顯示你如何構建src矩陣的代碼。 – Barshan 2013-04-10 10:27:30

+0

我試圖轉換圖像類型沒有運氣。請參閱本版中的相關代碼。再次感謝。 – Protocole 2013-04-11 02:25:55

1

可以使用

src.convertTo(SRC,CV_8UC3);

其中CV_8UC3表示您使用8位無符號字符和3色圖像表示。 更多信息,你可以在這裏找到OpenCV docs 之後,你的橢圓應該是綠色的,如果它不幫助發佈整個代碼。

+0

試過你的答案沒有成功。請在版本中查看完整的相關代碼。謝謝。 – Protocole 2013-04-11 02:27:25

0

我有類似的問題,我設法解決它首先轉換圖像到BGR。所以你的情況processImage來的功能看起來就像是:

-(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); 
} 

我已經包含在你的代碼中的唯一行是:

cvtColor(image, image, CV_RGBA2BGR); 

如果您還登錄通道,深度和在上述類型信息功能如下:

​​

你會轉換前看到:

channels 4 
depth 0 
type 24 
element size 4 

我認爲這是CV_8UC4和轉換後變成:

channels 3 
depth 0 
type 16 
element size 3 

這是CV_8UC3。

我猜爲什麼它沒有cvtColor不工作的原因之一是,當目標圖像是4通道時,opencv繪圖函數不支持alpha透明度,如opencv documentation中所述。所以通過轉換CV_RGBA2BGR我們可以取出alpha通道。不過話說回來,我不設法得到,如果我做的工作:

cvtColor(image, image, CV_RGBA2RGB); 

在這個紅色和藍色顏色的圖像中反轉。所以雖然它似乎有效,但我不確定這是否是真正的原因。

9

將alpha設置爲255可以解決此問題。 標量(94,206,165,255)

+0

請解釋。 – Irfan 2014-03-19 05:58:42

+1

我不知道如何,但這對我有效。 – bakalolo 2016-12-02 04:47:46