cv2.imshow在c++的用法
时间: 2024-09-09 12:11:37 浏览: 39
`cv2.imshow()`是OpenCV库(Computer Vision Library)中用于显示图像的一个函数,在C++环境中通常通过包含`opencv2/highgui.hpp`头文件来使用。它的基本语法如下:
```cpp
#include <opencv2/opencv.hpp>
// 假设有个名为"image"的Mat对象,它是OpenCV中的图像数据结构
cv::imshow("窗口名称", image);
// 显示之前需要调用cv::waitKey()函数来暂停程序,直到用户关闭窗口
cv::waitKey(0);
```
这里的关键点是:
1. 首先你需要创建一个`cv::Mat`类型的变量存储图像数据。
2. 使用`cv::imshow()`函数,第一个参数是一个字符串,表示窗口的标题;第二个参数是要展示的图像。
3. `cv::waitKey(0)`函数会暂停程序运行,直到用户按键。`0`表示无限等待用户操作。
注意:在OpenCV 4.x版本之后,为了避免警告,建议使用`cv::imshow2()`函数代替`cv::imshow()`,特别是在跨平台项目中。
相关问题
cv2.matchTemplate用法c++示例
`cv2.matchTemplate()` 是 OpenCV 库中用于在图像中寻找模板的函数。它可以根据给定的模板,在待匹配的图像中寻找匹配项,并返回匹配结果的位置。下面是一个简单的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 加载待匹配图像和模板
Mat img = imread("image.jpg");
Mat templ = imread("template.jpg");
// 创建匹配结果矩阵
Mat result;
int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;
result.create(result_rows, result_cols, CV_32FC1);
// 进行模板匹配
matchTemplate(img, templ, result, TM_CCORR_NORMED);
// 找到最佳匹配位置
double minVal, maxVal;
Point minLoc, maxLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
// 绘制匹配结果矩形框
rectangle(img, maxLoc, Point(maxLoc.x + templ.cols, maxLoc.y + templ.rows), Scalar(0, 255, 0), 2);
// 显示结果
imshow("Result", img);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先加载了待匹配的图像和模板。然后,我们创建了一个大小为 (result_rows, result_cols) 的矩阵来存储匹配结果。接下来,我们调用 `matchTemplate()` 函数进行模板匹配,并将结果存储在 `result` 矩阵中。在找到最佳匹配位置后,我们使用 `rectangle()` 函数在原始图像中绘制一个矩形框来标记匹配结果。最后,我们显示结果并等待用户按下任意键退出程序。
img=cv2.threshold(image,90,255,cv2.THRESH_BINARY) #调整裁剪效果 阈值算法速度优于canny算法 # img = cv2.Canny(image,100,20) # cannyb = cv2.resize(b,None,fx=0.25,fy=0.25) # cv2.imshow('Canny', cannyb) # cv2.waitKey(0) binary_image=img[1] #二值图--具有三通道 # binary_image = img # binary_image=cv2.cvtColor(binary_image,cv2.COLOR_BGR2GRAY) # print(binary_image.shape) #改为单通道 x = binary_image.shape[1] print("宽度x=", x) y=binary_image.shape[0] print("高度y=",y) x_min = 0 y_min = 0 x_max = 0 y_max = 0 count = 0 for r in range(y): if 255 in binary_image[r][:]: if count == 0: y_min = r count += 1 y_max = r
以下是将该Python代码转换为C++代码的实现示例:
```c++
cv::Mat img;
cv::threshold(image, img, 90, 255, cv::THRESH_BINARY);
// cv::Canny(image, img, 100, 200);
// cv::resize(b, cannyb, cv::Size(), 0.25, 0.25);
// cv::imshow("Canny", cannyb);
// cv::waitKey(0);
cv::Mat binary_image = img;
// cv::cvtColor(binary_image, binary_image, cv::COLOR_BGR2GRAY);
// std::cout << binary_image.size() << std::endl;
int x = binary_image.cols;
std::cout << "宽度x=" << x << std::endl;
int y = binary_image.rows;
std::cout << "高度y=" << y << std::endl;
int x_min = 0, y_min = 0, x_max = 0, y_max = 0, count = 0;
for (int r = 0; r < y; r++) {
bool has_object = false;
for (int c = 0; c < binary_image.cols; c++) {
if (binary_image.at<uchar>(r, c) == 255) {
has_object = true;
break;
}
}
if (has_object) {
if (count == 0) {
y_min = r;
}
count++;
y_max = r;
}
}
```
需要注意的是,在C++中使用OpenCV库进行图像处理时,需要使用`cv::Mat`类型来表示图像,并且需要使用`at<uchar>(r, c)`方法来获取图像中指定位置的像素值。此外,在使用`cv::threshold()`函数时,需要将输出结果赋值给一个新的`cv::Mat`对象,而不能直接覆盖原始输入图像。
阅读全文