6

次の質問に対する答えが見つかりません。

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

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

PS: 処理したい画像は既にメモリ内にあります。

4

2 に答える 2

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 つだけです。

于 2012-12-13T18:47:41.573 に答える
0

1) このドキュメントを確認する必要があります。

コードは次のようになります。

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

それは機能しますか?

于 2012-12-11T15:55:21.353 に答える