循环并通过图像矢量显示

时间:2014-01-31 08:11:30

标签: c++ loops opencv vector

我正在使用opencv和c ++。我正在做一个非常简单的程序。它的作用是在矢量垫中需要3个图像,将这些图像转换为hsv并再次将原始图像的hsv存储在矢量中。我想显示所有获得的3张hsv图像。但是当我的程序循环时,它只显示向量中的最后一个hsv图像。这是我的代码:http://pastebin.com/z7FBrtxs

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(){
    vector<Mat> imgs;

    Mat left=imread("left.jpg");
    Mat front=imread("front.jpg");
    Mat right=imread("right.jpg");

    imgs.push_back(left);
    imgs.push_back(front);
    imgs.push_back(right);


    vector<Mat> hsvs;
    Mat left_hsv;
    Mat front_hsv;
    Mat right_hsv;

    cvtColor(left,left_hsv,CV_BGR2HSV);
    cvtColor(front,front_hsv,CV_BGR2HSV);
    cvtColor(right,right_hsv,CV_BGR2HSV);

    hsvs.push_back(left_hsv);
    hsvs.push_back(front_hsv);
    hsvs.push_back(right_hsv);

    for(int i=0;i<3;i++){
        imshow("hsv",hsvs[i]);
    }
    waitKey(0);
    return 0;
}

3 个答案:

答案 0 :(得分:4)

for(int i=0;i<3;i++){
    imshow("hsv",hsvs[i]);
}
waitKey(0);

表示您在名为“hsv”的窗口中显示所有图像。显示最后一个后,等待用户输入。因此,图像实际上全部都显示在窗口中,按顺序,它只是它们切换得如此之快以至于你永远看不到它。 将其更改为

for(int i=0;i<3;i++){
    imshow("hsv",hsvs[i]);
    waitKey(0);
}

你应该好。 此更改意味着每个图像将显示在“hsv”窗口中,然后在显示下一个图像之前等待您按下按钮。

您也可以通过将窗口重命名为“hsv1”,“hsv2”等来同时显示多个窗口。

答案 1 :(得分:3)

使用:

for(int i=0;i<3;i++){
    imshow("hsv",hsvs[i]);
    waitKey(0); //Note: wait for user input for every image
}

或在三个不同的命名窗口中显示它们(参见文档)。

答案 2 :(得分:1)

由于没有提供坐标,我猜所有图像都是在相同的默认位置(视口原点)绘制的,最后一张图像是在以前的所有图像上绘制的。