首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCv多光谱图像openCV

OpenCv多光谱图像openCV
EN

Stack Overflow用户
提问于 2015-06-09 07:40:03
回答 2查看 2K关注 0票数 1

我正在尝试导入到openCV (c++)的图像.TIF,它有几个波段。使用命令imread,它只显示第一个带。我怎样才能访问其他网站?

更重要的是,我试图用ifstream访问文件,但看起来我犯了一些错误!

谢谢你的帮助!

最好的

EN

回答 2

Stack Overflow用户

发布于 2016-03-18 07:32:44

OpenCV目前不支持多页图片读取。它将只读取第一个图像。

对于C++ .TIFF阅读,libtiff有一组很好的示例。Imagemagick也支持C++。您可以读取图像并将数据缓冲区复制到OpenCV Mat中。

以下是使用imagemagick的Magick++例程的示例c++代码:

代码语言:javascript
运行
复制
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
#include <Magick++.h>
#include <sstream>
#include <exception>

using namespace Magick;
using namespace std;
using namespace cv;

template < typename T > std::string to_string( const T& n )
{
    std::ostringstream stm ;
    stm << n ;
    return stm.str() ;
}

vector <Mat> read_images( string filename, int num=1, string dpi="300" ) {

    vector <Mat> ret;
    Image image;
    image.density(dpi);

    int cols, rows;
    int i = 0; 
    while( i < num ) {
        cout << filename + "[" + to_string(i) + "]" << endl;
        try { 
            image.read(filename + "[" + to_string(i) + "]");
        }catch ( exception ex ) {
            cout << "read " << i << " pages" << endl;
            break;
        }
        i++;
        cols = image.columns();
        rows = image.rows();
        char* blob = new char[cols*rows*3];

        image.write(0,0, cols, rows, "RGB", MagickCore::CharPixel, blob);

        ret.push_back(Mat(rows, cols, CV_8UC3, blob));
    }

    return ret; 
}


int main ( int argc, char** argv ) {
    vector<Mat> images = read_images(argv[1], 10);

    for( int i = 0; i < images.size(); i++ ) {
        imshow("image", images[i]);
        waitKey();
    } 
}
票数 2
EN

Stack Overflow用户

发布于 2015-12-22 23:57:39

在这里,一些代码将有助于查看哪里出了问题。

但是,您似乎只访问了第一个频段,而不是您想要的所有频段。

尝试如下所示(本例中有3个频段,因此为Vec3b):

代码语言:javascript
运行
复制
Vec3b image = imread(filePath, CV_LOAD_IMAGE_UNCHANGED);

这会将图像存储在3波段矢量中(有几种类型具有不同数量的波段,如Vec4b或Vec5b)。然后,您可以像访问向量中的元素一样访问每个波段:

代码语言:javascript
运行
复制
image[0]
image[1]
image[2]

如果我的假设是正确的,那么您正在尝试通过使用类似于

代码语言:javascript
运行
复制
int bandValue = (int)image;

或者类似的东西。请记住,引用向量(或数组)的名称与访问该向量(或数组)中的第一个元素相同

代码语言:javascript
运行
复制
image = image[0]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30720778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档