cv::mat& image使用代码
时间: 2024-02-17 13:05:19 浏览: 122
下面是一个简单的使用cv::Mat和image的示例代码:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("example.jpg"); // 加载图像
if (image.empty()) // 判断图像是否加载成功
{
cout << "Could not open or find the image" << endl;
return -1;
}
namedWindow("Display window", WINDOW_NORMAL); // 创建窗口
imshow("Display window", image); // 显示图像
waitKey(0); // 等待用户按下键盘
return 0;
}
```
这个例子加载了名为“example.jpg”的图像,并在一个名为“Display window”的窗口中显示它。在等待用户按下键盘之前,程序将一直挂起。
相关问题
按照以下代码编写vs2010版本的所需要的头文件#include<opencv2/core.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include<iostream> using namespace std; using namespace cv; //创建灰度图像的直方图 class Histogram1D { private: int histSize[1];//直方图中箱子的数量 float hranges[2];//值范围 const float* ranges[1];//值范围的指针 int channels[1];//要检查的通道数量 public: Histogram1D() { //准备一维直方图的默认参数 histSize[0] = 256;//256个箱子 hranges[0] = 0.0;//从0开始(含) hranges[1] = 256.0;//到256(不含) ranges[0] = hranges; channels[0] = 0;//先关注通道0 } cv::Mat getHistogram(const cv::Mat& image); }; //计算一维直方图 cv::Mat Histogram1D::getHistogram(const cv::Mat& image) { cv::Mat hist; //用calcHist函数计算一维直方图 cv::calcHist(&image, 1, //仅为一幅图像的直方图 channels, //使用的通道 cv::Mat(), //不使用掩码 hist, //作为结果的直方图 1, //这是一维的直方图 histSize, //箱子数量 ranges //像素值的范围 ); return hist; } int main() { //读取输入的图像 cv::Mat image = cv::imread("girl.jpg", 0);//以黑白方式打开 //直方图对象 Histogram1D h; //计算直方图 cv::Mat histo = h.getHistogram(image); //循环遍历每个箱子 for (int i = 0; i < 256; i++) cout << "Value" << i << "=" << histo.at<float>(i) << endl; }
以下是按照所给代码编写的vs2010版本所需要的头文件:
```c++
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
//创建灰度图像的直方图
class Histogram1D
{
private:
int histSize[1];//直方图中箱子的数量
float hranges[2];//值范围
const float* ranges[1];//值范围的指针
int channels[1];//要检查的通道数量
public:
Histogram1D()
{
//准备一维直方图的默认参数
histSize[0] = 256;//256个箱子
hranges[0] = 0.0;//从0开始(含)
hranges[1] = 256.0;//到256(不含)
ranges[0] = hranges;
channels[0] = 0;//先关注通道0
}
cv::Mat getHistogram(const cv::Mat& image);
};
//计算一维直方图
cv::Mat Histogram1D::getHistogram(const cv::Mat& image)
{
cv::Mat hist;
//用calcHist函数计算一维直方图
cv::calcHist(&image, 1, //仅为一幅图像的直方图
channels, //使用的通道
cv::Mat(), //不使用掩码
hist, //作为结果的直方图
1, //这是一维的直方图
histSize, //箱子数量
ranges //像素值的范围
);
return hist;
}
int main()
{
//读取输入的图像
cv::Mat image = cv::imread("girl.jpg", 0);//以黑白方式打开
//直方图对象
Histogram1D h;
//计算直方图
cv::Mat histo = h.getHistogram(image);
//循环遍历每个箱子
for (int i = 0; i < 256; i++)
cout << "Value" << i << "="
<< histo.at<float>(i) << endl;
return 0;
}
```
需要注意的是,以上代码中的图片文件girl.jpg需要放置在与源代码文件相同的目录下,否则需要指定正确的图片路径。
void get_image(cv::VideoCapture &cap, Mat &image){ while(true){ cap >> image; this_thread::sleep_for(chrono::milliseconds (30)); } }
这段代码定义了一个名为 `get_image` 的函数,该函数使用了 OpenCV 库中的 `cv::VideoCapture` 类来从摄像头或者视频文件中读取帧,并将帧存储到 `cv::Mat` 对象中。该函数的参数包括一个 `cv::VideoCapture` 对象引用 `cap` 和一个 `cv::Mat` 对象引用 `image`。
函数的主要逻辑是通过 `cap >> image;` 从 `cap` 中读取一帧,并将其存储到 `image` 中。然后使用 `this_thread::sleep_for(chrono::milliseconds (30));` 函数使当前线程休眠 30 毫秒,以等待下一帧的到来。函数将一直循环执行,直到程序被手动中止。
该函数使用了 C++11 标准库中的线程库,需要包含头文件 `<thread>` 和 `<chrono>`。如果要在程序中使用该函数,需要先创建一个 `cv::VideoCapture` 对象,并将其作为参数传递给 `get_image` 函数,例如:
```c++
#include <opencv2/opencv.hpp>
#include <thread>
#include <chrono>
using namespace cv;
void get_image(VideoCapture& cap, Mat& image) {
while (true) {
cap >> image;
this_thread::sleep_for(chrono::milliseconds(30));
}
}
int main() {
VideoCapture cap(0); // 打开默认的摄像头
Mat image;
thread t(get_image, ref(cap), ref(image));
// 在这里可以对 image 进行处理,例如显示或保存到文件中
t.join();
return 0;
}
```
在主函数中,首先创建了一个默认的 `cv::VideoCapture` 对象 `cap`,用于打开默认摄像头。然后创建了一个 `cv::Mat` 对象 `image`,用于存储从摄像头中读取的帧。接着使用 `std::thread` 类创建了一个新线程,并将 `cap` 和 `image` 作为参数传递给 `get_image` 函数。在新线程中,函数将不断从 `cap` 中读取帧,并将其存储到 `image` 中。在主线程中,可以对 `image` 进行处理,例如显示或保存到文件中。最后使用 `t.join()` 等待新线程执行完毕。
阅读全文