2012-12-11 61 views
5

我無法找到你的這些問題:如何在OpenCV中使用16位灰度?

  1. 我可以使用OpenCV的顯示16位灰度圖片?我嘗試了imshow(),但OpenCV創建的窗口中沒有任何內容出現。

  2. 我怎麼能轉換爲16位灰階畫面時的B5G6R5圖片?爲了存儲這個結構,我應該創建什麼參數cv::Mat?我試過cv::cvtColor(m_cvTmp, tmp, CV_GRAY2BGR565),但這個功能不斷崩潰。 documentation on miscellaneous image transformations沒有說出答案。

PS:我想要處理的圖像已經在內存中。

+0

確保你投入'waitKey'通話imshow'後'。省略'waitKey'將是什麼都沒有出現的原因之一。 – SSteve

+0

我確實使用了waitKey,窗口在那裏但空白。 – LeOpArD

+0

你可能不應該說「沒有出現在屏幕上」。這不同於「屏幕上出現空白窗口」。問題中的細節越好,獲得有用答案的機會就越大。 – SSteve

回答

0

1)你必須看看這個documentation

您的代碼會像:

Mat imageGrey = imread("<image_name>", CV_LOAD_IMAGE_GRAYSCALE); 

2)

Mat imageGrey = imread("<image_name>", CV_LOAD_IMAGE_GRAYSCALE); 
Mat imageBGR; 
cvtColor(imageGrey, imageBGR, CV_GRAY2BGR565); 

工作的?

+0

忘記提到我是處理後的圖像已經在內存(從另一個LIB)。我創建了符合其內部表示的cv :: Mat,然後memcpy數據。 – LeOpArD

1

根據用於imshow文檔,它會自動縮放一個16位的灰度級的8位,以便將其顯示在屏幕上。我用以下程序測試了這個:

#include <iostream> 

#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 

using namespace std; 

int main(int argc, char *argv[]) { 
    cv::Mat image; 
    image = cv::imread("pic2.jpg"); 

    if (!image.data) { 
     std::cout << "Image file not found\n"; 
     return 1; 
    } 

    cv::cvtColor(image, image, CV_BGR2GRAY); 
    cv::Mat pic16bit; 
    image.convertTo(pic16bit, CV_16U, 255); //convert to 16-bit by multiplying all values by 255 

    // create image window named "asdfasdf" 
    cv::namedWindow("asdfasdf"); 
    // show the image on window 
    cv::imshow("asdfasdf", pic16bit); 
    // wait for key 
    cv::waitKey(0); 

    return 0; 
} 

它按預期顯示灰度圖像。所以,如果你只是得到一個空白的窗口,我的猜測是你從其他庫到cv :: Mat的轉換不能正常工作。例如,當我第一次嘗試從8位轉換爲16位時,我得到了全黑圖像,因爲我忘記了將所有8位值乘以255.

作爲調試的第一步,我會嘗試顯示16位灰度cv :: Mat中的部分或全部值。

此外,作爲一般規則,堆棧溢出效果最好,如果你只需要在你的問題一個問題。當有多個問題時,你會得到多個有效的答案,但你只能接受其中的一個。

+0

謝謝。下次我會分離我的問題。 – LeOpArD