我正在使用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;
}
答案 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)
由于没有提供坐标,我猜所有图像都是在相同的默认位置(视口原点)绘制的,最后一张图像是在以前的所有图像上绘制的。