findContours函数后没有图片显示
时间: 2023-10-11 07:10:24 浏览: 40
使用findContours函数后,函数本身并不会显示图片。findContours函数的主要作用是找到图像中的轮廓。它会修改源图像,并返回一个包含所有轮廓点坐标的列表。如果您希望看到轮廓,您可以将找到的轮廓绘制到原始图像上,然后显示该图像。您可以使用OpenCV的绘制函数(如cv2.drawContours)来实现这一点。示例代码如下:
contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)
cv2.imshow("Image with Contours", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例中,我们首先使用findContours函数找到图像中的轮廓,并将它们存储在变量contours中。然后,我们使用drawContours函数将轮廓绘制到原始图像上,并显示该图像。你可以调整绘制轮廓的参数以达到你想要的效果。记得在显示图像后使用cv2.waitKey(0)等待用户按下任意键关闭窗口,并使用cv2.destroyAllWindows()销毁所有的窗口。
相关问题
C++findcontours函数使用
使用C++中的`findContours`函数,需要先准备好输入的二值图像`image`,并创建一个向量`vector<vector<Point>> contours`来存储输出的轮廓信息。
下面是一个简单的示例代码,实现了从一张图片中提取出所有轮廓,并将其绘制在新的画布上:
```C++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取输入图像
Mat img = imread("input.jpg", CV_LOAD_IMAGE_GRAYSCALE);
// 检查图像是否读取成功
if (img.empty())
{
cout << "Could not read the image: " << endl;
return 1;
}
// 创建一个空的画布
Mat canvas(img.size(), CV_8UC3, Scalar(0, 0, 0));
// 阈值化图像
Mat thresh;
threshold(img, thresh, 100, 255, THRESH_BINARY);
// 查找轮廓
vector<vector<Point>> contours;
findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 绘制轮廓
drawContours(canvas, contours, -1, Scalar(0, 255, 0), 2);
// 显示结果
imshow("Contours", canvas);
waitKey(0);
return 0;
}
```
在上述代码中,首先读取了一张图片,然后创建了一个空的画布。接着,使用`threshold`函数对图像进行了阈值化处理,得到一个二值图像。然后,使用`findContours`函数查找轮廓,并将结果存储在`contours`向量中。最后,使用`drawContours`函数将所有轮廓绘制到画布上,并将结果显示出来。
需要注意的是,这里使用了`RETR_EXTERNAL`参数来指定只查找最外层轮廓。如果需要查找所有轮廓,可以使用`RETR_LIST`参数。
我的意思是根据findContours函数之后输出的contours来在ui上绘制轮廓,并用鼠标对这些轮廓进行编辑
你可以使用OpenCV中的drawContours函数来在UI上绘制轮廓。具体步骤如下:
1. 使用findContours函数获取轮廓信息,并将其存储在一个vector中。
2. 在UI上创建一个画布,并将图片显示在上面。
3. 使用drawContours函数将轮廓绘制在画布上。
4. 添加鼠标事件监听器,在鼠标点击轮廓时,根据鼠标位置编辑轮廓。
以下是一个简单的示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
// 鼠标事件回调函数
void onMouse(int event, int x, int y, int flags, void* param)
{
if (event == EVENT_LBUTTONDOWN)
{
// 在此处处理鼠标点击事件
}
}
int main()
{
// 读取图片
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
// 获取轮廓信息
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(img, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
// 创建画布并显示图片
Mat canvas = Mat::zeros(img.size(), CV_8UC3);
cvtColor(img, canvas, COLOR_GRAY2BGR);
imshow("Canvas", canvas);
// 绘制轮廓
drawContours(canvas, contours, -1, Scalar(0, 0, 255), 2);
imshow("Canvas", canvas);
// 添加鼠标事件监听器
setMouseCallback("Canvas", onMouse, NULL);
waitKey(0);
return 0;
}
```
在onMouse函数中,你可以根据鼠标位置和轮廓信息,实现对轮廓的编辑。例如,你可以使用pointPolygonTest函数来判断鼠标位置是否在轮廓内部,然后根据需要对轮廓进行修改。