【问题标题】:Viewing 8 bit RAW image file in openCV在 openCV 中查看 8 位 RAW 图像文件
【发布时间】:2013-03-09 11:56:22
【问题描述】:

我有一个原始文件,其中包含 5 个字节的标头,其中包含每个前两位的行数和列数。第 5 个字节包含图像中每个像素的位数,在所有情况下都是 8 位。图像数据紧随其后。

由于我是openCV的新手,我想问一下如何使用C++将这个RAW图像文件作为灰度图像查看?

我知道如何在 C++ 中读取二进制数据并将图像存储为二维无符号字符数组(因为每个像素都是 8 位)。

谁能告诉我如何使用 openCV 将这些数据作为图像查看?

我正在使用下面的代码,但得到一个完全奇怪的图像:

void openRaw() {
    cv::Mat img(numRows, numCols,CV_8U,&(image[0][0]));
    //img.t();
    cv::imshow("img",img);  
    cv::waitKey();
}

任何帮助将不胜感激。

谢谢, 罗希特

【问题讨论】:

    标签: c++ opencv image-processing binary-data


    【解决方案1】:

    您必须将其转换为 IplImage。

    如果你想把它看成纯灰度图像,其实很简单。

    我在一个应用程序中使用的示例代码:

    CvSize mSize;
    mSize.height = 960;
    mSize.width = 1280;
    
    IplImage* image1 = cvCreateImage(mSize, 8, 1);
    memcpy( image1->imageData, rawDataPointer, sizeOfImage);
    cvNamedWindow( "corners1", 1 );
    cvShowImage( "corners1", image1 );
    

    此时您有一个有效的 IplImage,然后您可以显示它。 (最后两行代码显示)

    如果图像是拜耳平铺的,则必须转换为 RGB。

    【讨论】:

    • 如果数据在文件中,我如何传递 rawDataPointer? sizeOfImage 会是高度*宽度吗?
    • 嗯,你必须先读取文件,并从中提取高度/宽度,然后创建一个指向读取数据的内存指针。 sizeOfImage 是,对于 8 位灰度图像的高度 * 宽度,对于 RGB,它的高度 * 宽度 * 3。
    【解决方案2】:

    c++ 表示法:

    cv::Mat img(rows,cols,CV_8U,ptrToDat);
    cv::imwhow("img",img);
    cv::waitkey();
    

    *数据应按列保存,否则使用:

    cv::Mat img(cols,rows,CV_8U,ptrToDat);
    img=img.t();
    cv::imwhow("img",img);
    cv::waitkey();
    

    【讨论】:

    • 如果数据在文件中,如何给ptrToDat?很抱歉我不太会 C++,你能提供更多代码吗?
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2013-02-08
    • 1970-01-01
    相关资源
    最近更新 更多