#include<opencv2/opencv.hpp> #include<iostream> #include <string> using namespace cv; void ImageThreshold(String str) { Mat image = imread(str); Mat binary; cvtColor(image, binary, COLOR_BGR2GRAY); imshow("test_opencv_srtup", binary); waitKey(0); } int main() { String str = "壁纸3.jpg"; // 注意文件路径和你所对应的图片 ImageThreshold(str); return 0; }
时间: 2024-04-25 20:27:20 浏览: 147
这是一个使用OpenCV库进行图像处理的程序。
程序首先包含了必要的头文件,包括OpenCV的头文件、iostream和string。然后定义了一个ImageThreshold函数,该函数的作用是将输入的图像进行二值化处理并显示出来。
在main函数中,先定义了一个字符串str,指定了要处理的图像文件名。然后调用ImageThreshold函数对图像进行处理。处理完成后,程序返回0结束运行。
注意到程序中的代码将图像读入为BGR格式的彩色图像,然后将其转换为灰度图像,并显示出来。这里使用了OpenCV中的imread函数读取图像,cvtColor函数对图像进行颜色空间转换,imshow函数显示图像,waitKey函数等待键盘输入。
相关问题
#include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> using namespace std; using namespace cv; #include <opencv2/wechat_qrcode.hpp> int main() { const std::string modelDir = R"(D:\opencv\opencv4.5.4\build_contrib\downloads\wechat_qrcode\)"; // 构造(使用异常捕获构造函数是否正常) wechat_qrcode::WeChatQRCode detector{ modelDir + "detect.prototxt", modelDir + "detect.caffemodel", modelDir + "sr.prototxt", modelDir + "sr.caffemodel" }; // 临时变量 Mat img; vector<Mat> points; // qrcode: Retangle, not RotatedBox auto camIdx = 0; // auto camIdx = R"(C:\Users\wanggao\Desktop\qrconde_test.jpg)"; VideoCapture cap(camIdx); while(cap.read(img)){ // 检测 auto res = detector->detectAndDecode(img, points); // 结果叠加 for(size_t idx = 0; idx < res.size(); idx ++){ Point pt1 = points[idx].at<Point2f>(0); Point pt2 = points[idx].at<Point2f>(2); Rect rect{pt1, pt2}; Point center = (pt1 + pt2) / 2; // 绘制矩形框 rectangle(img, rect, {0,0,255}, 2); circle(img, center, rect.height / 15, {0,0,255}, -1); // 解码字符串 putText(img, res[idx], {pt1.x, pt2.y + 16}, 1, 1, {0,0,255}); } imshow("image", img); if (waitKey(30) >= 0) break; } return 0; } 为什么detector->detectAndDecode这句话调用几次后会导致程序崩溃
这个问题可能是由于内存泄漏导致的。在循环中多次调用`detectAndDecode`函数,每次调用都会分配一些内存,如果没有及时释放这些内存,就会导致内存耗尽,最终导致程序崩溃。
有两种方法可以解决这个问题:
1. 在循环中每次调用`detectAndDecode`函数之前,先释放上一次调用生成的内存。可以使用`points.clear()`和`res.clear()`清空上一次调用生成的内存,或者使用`points.resize(0)`和`res.resize(0)`将向量的大小重置为0。
2. 将`detector`对象定义在循环外部,避免多次构造和析构。可以将`detector`对象定义为全局变量或静态变量,或者将其定义在`main`函数的外部。
下面是第一种方法的修改后的代码:
```c++
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
#include <opencv2/wechat_qrcode.hpp>
int main()
{
const std::string modelDir = R"(D:\opencv\opencv4.5.4\build_contrib\downloads\wechat_qrcode\)";
// 构造(使用异常捕获构造函数是否正常)
wechat_qrcode::WeChatQRCode detector{
modelDir + "detect.prototxt",
modelDir + "detect.caffemodel",
modelDir + "sr.prototxt",
modelDir + "sr.caffemodel"
};
// 临时变量
Mat img;
vector<Mat> points;
vector<string> res;
auto camIdx = 0;
// auto camIdx = R"(C:\Users\wanggao\Desktop\qrconde_test.jpg)";
VideoCapture cap(camIdx);
while(cap.read(img)){
// 检测
detector->detectAndDecode(img, points, res);
// 结果叠加
for(size_t idx = 0; idx < res.size(); idx ++){
Point pt1 = points[idx].at<Point2f>(0);
Point pt2 = points[idx].at<Point2f>(2);
Rect rect{pt1, pt2};
Point center = (pt1 + pt2) / 2;
// 绘制矩形框
rectangle(img, rect, {0,0,255}, 2);
circle(img, center, rect.height / 15, {0,0,255}, -1);
// 解码字符串
putText(img, res[idx], {pt1.x, pt2.y + 16}, 1, 1, {0,0,255});
}
imshow("image", img);
if (waitKey(30) >= 0)
break;
// 释放内存
points.resize(0);
res.resize(0);
}
return 0;
}
```
在这个修改后的代码中,每次调用`detectAndDecode`函数之前,都会将`points`和`res`向量的大小重置为0,以释放上一次调用生成的内存。
#ifndef MY_HEADER_FILE_H #define MY_HEADER_FILE_H //#include "stdafx.h" #include <WINSOCK2.H> #include <iostream> #include <stdio.h> //#include <opencv/cv.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp>
这段代码中的条件编译指令 `#ifndef` 和 `#define` 是正确的,但是在这个指令的下面,又出现了包含其他头文件的指令 `#include`。如果这些头文件中包含了当前头文件,就可能导致文件包含自身的问题。
为了避免这种情况,建议将所有的 `#include` 指令放在条件编译指令之间,例如:
```
#ifndef MY_HEADER_FILE_H
#define MY_HEADER_FILE_H
// 包含其他头文件
#include "stdafx.h"
#include <WINSOCK2.H>
#include <iostream>
#include <stdio.h>
#include <opencv/cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
// 头文件内容
#endif
```
这样,可以确保在条件编译指令之前包含的头文件不会包含当前头文件,避免了文件包含自身的问题。
阅读全文