2012-12-11 73 views
5

私はこれらの質問に対する答えを見つけることができません。OpenCVで16ビットのグレースケールを扱うには?

  1. が、私は16ビットのグレースケール画像を表示するためのOpenCVを使用することはできますか?私はimshow()を試しましたが、OpenCVによって作成されたウィンドウに何も表示されませんでした。

  2. 16ビットグレースケール画像をB5G6R5画像に変換するにはどうすればよいですか?この構造を保存するには、どのようなパラメータを使用してcv::Matを作成する必要がありますか?私はcv::cvtColor(m_cvTmp, tmp, CV_GRAY2BGR565)を試しましたが、この機能はクラッシュし続けました。 documentation on miscellaneous image transformationsは答えを教えてくれません。

PS:処理したい画像がすでにメモリにあります。

+0

'imshow'の後に' waitKey'を呼び出すようにしてください。 'waitKey'を省略すると、何も表示されない理由の1つになります。 – SSteve

+0

私はwaitKeyを使いましたが、ウィンドウは空白でした。 – LeOpArD

+0

「画面に何も表示されていません」と言ってはいけません。それは「空白のウィンドウが画面に表示された」とは異なります。あなたの質問の詳細が良くなれば、役に立つ答えを得るチャンスが増えます。 – SSteve

答えて

0

1)このdocumentationをご覧ください。

あなたのコードは次のようになります:

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

は、それが動作い

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

2)?

+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の値の一部または全部を表示してみてください。

また、スタックオーバーフローは、質問に1つの質問しかない場合に最も効果的です。複数の質問がある場合は、複数の有効な回答が得られますが、そのうちの1つのみを受け入れることができます。

+0

ありがとうございます。私は次回に自分の質問を分けます。 – LeOpArD