2013-05-29 59 views
6

我想測試是尋找特定墊深度& &一些渠道建立深度簡歷::墊

它的測試...

if (image.channels() == 1 && image.depth() == 8) ... 
else if (image.channels() == 1 && image.depth() == 16) ... 
else if (image.channels() == 1 && image.depth() == 32) ... 
else 
{ 
    if ((image.channels() != 3) || (image.depth() != 8)) 
    {printf("Expecting rgb24 input image"); return false;} 
    ... 
} 

我比較喜歡的一個功能用一個虛構的墊進行測試,避免使用本地資源:

cv::Mat M(255, 255, CV_8UC3, cv::Scalar(0,0,255)); 
printf("M: %d %d \n", M.channels(), M.depth()); 
cv::Mat M1(255, 255, CV_32F, cv::Scalar(0,0,255)); 
cv::Mat M2(255, 255, CV_32FC3, cv::Scalar(0,0,255)); 
cv::Mat M2(255, 255, CV_8SC3, cv::Scalar(0,0,255)); 

我同種組合的試驗,但如果我打印,我得到0的深度。

我也嘗試加載PNG或JPG文件 - 有相同的結果(我不喜歡使用外部的文件...但我看不出爲什麼這不起作用)

cv::Mat M3 = cv::imread("c:/my_image.png", CV_LOAD_IMAGE_COLOR); 
cv::Mat M3 = cv::imread("c:/my_image.jpg", CV_LOAD_IMAGE_COLOR); 

他們都似乎有深度= 0?

還有什麼我需要做的嗎?我看不到任何文件...

謝謝

回答

9

當你調用墊上深度(),它返回的深度值如下定義的,而不是位數:

#define CV_8U 0 
#define CV_8S 1 
#define CV_16U 2 
#define CV_16S 3 
#define CV_32S 4 
#define CV_32F 5 
#define CV_64F 6 

你可以使用cv :: DataDepth :: value來找出哪一個是哪個。例如,

cv::DataDepth<unsigned char>::value == CV_8U; 
cv::DataDepth<float>::value == CV_32F; 

所以,你應在所有CV_8UCX矩陣得到0,當你加載一個圖像,它通常加載CV_8UC3,所以你會得到0爲好。但我不知道爲什麼你在cv :: Mat M(255,255,CV_32FC3)上得到0,我在我的電腦上測試了它,它返回了5.

+0

所以...在函數中的測試是錯誤的。 ..我改變它從C版本,它是如果(圖像 - > nChannels == 1 &&圖像 - >深度== 8)等等 – Thalia

+0

是啊,C++接口是不同的,這裏是最新的深度文檔):http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-depth – cxyzs7