为了做到 "c++结合opencv如何实现读取多张图片并显示",我们可以按照以下步骤:
- 在C++中读取多个图像,并将它们存储到一个vector容器中;
- 对图像进行处理,例如调整大小、灰度化等;
- 用OpenCV中的imshow函数将图像显示出来。
现在我们来一步步实现。
读取多个图像
首先,我们需要找到要读取的图像的路径并将它们存储到一个vector容器中。下面的示例代码展示了如何将多个图像读取并存储到一个vector容器中。
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>
int main()
{
std::string path = "path_to_images_folder";
std::vector<cv::Mat> images;
std::vector<std::string> filenames = { "image1.jpg", "image2.jpg", "image3.jpg" };
for (auto filename : filenames)
{
cv::Mat image = cv::imread(path + "/" + filename);
if (image.empty())
{
std::cerr << "Could not read image: " << filename << std::endl;
return 1;
}
images.push_back(image);
}
return 0;
}
代码中,
- 首先我们定义一个路径变量“path”以及一个空的vector容器“images”。
- 然后,我们定义一个包含文件名的vector容器来读取图像,这里仅作示范。
- 每张图像都通过cv::imread函数读取并存储到images容器中。在读取图像后,我们需要检查图像是否为空,如果为空,则说明读取失败,应该打印一个错误消息并退出程序。
图像处理
我们可以在显示之前编辑图像。例如,可以调整大小,并将图像转换为灰度图像。下面的示例代码展示了如何将读取的图像调整大小并转换为灰度图像。
int main()
{
// ...
for (auto& image : images)
{
// resize image
cv::resize(image, image, cv::Size(), 0.5, 0.5);
// convert to grayscale
cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
}
// ...
}
代码中,
- 我们使用cv::resize函数调整图像大小,该函数需要一个缩放比例以及一个期望大小。这里我们将图像大小缩小一半。
- 然后,我们使用cv::cvtColor函数将图像转换为灰度图像。在这里我们将BGR彩色图像转换为灰度图像,可以根据需要进行更改。
显示图像
最后一步是将预处理的图像通过imshow函数显示出来。下面是完整代码:
int main()
{
std::string path = "path_to_images_folder";
std::vector<cv::Mat> images;
std::vector<std::string> filenames = { "image1.jpg", "image2.jpg", "image3.jpg" };
for (auto filename : filenames)
{
cv::Mat image = cv::imread(path + "/" + filename);
if (image.empty())
{
std::cerr << "Could not read image: " << filename << std::endl;
return 1;
}
images.push_back(image);
}
for (auto& image : images)
{
// resize image
cv::resize(image, image, cv::Size(), 0.5, 0.5);
// convert to grayscale
cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
// display image
cv::imshow("Image", image);
cv::waitKey(0);
}
return 0;
}
代码中,
- 在完成读取和预处理后,我们循环遍历每个图像,并使用cv::imshow函数将图像显示出来。
- 当cv::waitKey函数不在循环中使用时,按下任意键后将关闭窗口。若在循环中使用,则在显示下一张图像前会等待用户按下一个键。
可以看到,在上面的代码中通过cv::imshow函数已经完成了最后的显示。其中,第一个参数是显示图像时的窗口的名称,第二个参数是要显示的图像。
另一个例子是,通过使用OpenCV的文件读取器函数glob。glob函数用于从文件夹中一次读取多个文件。这里有一个例子:
int main()
{
std::string path = "path_to_images_folder";
std::vector<cv::Mat> images;
std::vector<cv::String> filenames;
cv::glob(path, filenames);
for (auto& filename : filenames)
{
cv::Mat image = cv::imread(filename);
if (image.empty())
{
std::cerr << "Could not read image: " << filename << std::endl;
return 1;
}
images.push_back(image);
}
for (auto& image : images)
{
// resize image
cv::resize(image, image, cv::Size(), 0.5, 0.5);
// convert to grayscale
cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
// display image
cv::imshow("Image", image);
cv::waitKey(0);
}
return 0;
}
在这个例子中,我们使用cv::glob函数从文件夹中读取图像,并将它们存储在一个vector容器中。然后,我们按照之前的方式预处理图像并显示它们。
在上面的所有例子中,我们都可以根据需要更改读取的图像路径和图像名称。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++结合opencv如何实现读取多张图片并显示 - Python技术站