opencv从摄像头获取图片帧并做边缘检测

13 篇文章 1 订阅
// opencv6_videocapturefromcamera.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
//#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/imgproc.hpp>

using namespace cv;
using namespace std;

//debug下在lib文件的名称后加d,release下不加d。


int main()
{
	VideoCapture capture(0);	// 0为电脑自带摄像头
	/*capture.open(0);*/
	if (capture.isOpened())
	{
		cout << "已打开摄像头" << endl;
	}
	else
	{
		cout << "摄像头打开失败" << endl;
	}

	while (1)
	{
		Mat frame;
		capture >> frame;	//读取当前帧
		if (frame.data == NULL)
			break;
		imshow("读取视频的当前帧", frame);

		Mat edges;
		cvtColor(frame, edges, COLOR_BGR2GRAY);	//转为灰图
		blur(edges, edges, Size(8, 8));		//降噪
		Canny(edges, edges, 3, 9, 3);	//边缘检测

		imshow("边缘检测效果", edges);

		if (waitKey(30) >= 0)
			break;
	}
	capture.release();
	return 0;
}


这个问题可以分成两个部分来解决。 第一部分是读取图片边缘特征,可以使用OpenCV中的Canny算法实现。具体步骤如下: 1. 读取图片,将其转为灰度图像。 2. 使用Canny算法检测边缘,得到二值图像。 3. 对二值图像进行膨胀操作以填充边缘断裂的部分。 4. 使用findContours函数找到图像中的轮廓。 代码如下: ```python import cv2 # 读取图片 img = cv2.imread("image.jpg") # 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Canny边缘检测 edges = cv2.Canny(gray, 100, 200) # 膨胀操作 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) dilated = cv2.dilate(edges, kernel) # 找到轮廓 contours, hierarchy = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓 cv2.drawContours(img, contours, -1, (0, 0, 255), 2) # 显示结果 cv2.imshow("Image", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 第二部分是调用摄像头,实时获取摄像头图像并提取边缘特征,然后与之前读取的图片边缘特征进行对比。可以使用OpenCV中的VideoCapture类实现。具体步骤如下: 1. 创建VideoCapture对象,打开摄像头。 2. 循环读取摄像头图像。 3. 对每图像进行与第一部分相同的边缘特征提取操作。 4. 使用matchShapes函数对当前图像的边缘特征与之前读取的图片边缘特征进行对比,得到相似度。 5. 如果相似度超过某个阈值,则绘制矩形框圈出相同的部分。 代码如下: ```python import cv2 # 读取图片 img = cv2.imread("image.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 100, 200) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) dilated = cv2.dilate(edges, kernel) contours, hierarchy = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) ref_contour = contours[0] # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头图像 ret, frame = cap.read() # 边缘特征提取 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 100, 200) dilated = cv2.dilate(edges, kernel) contours, hierarchy = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 对比边缘特征 min_similarity = 0.9 for cnt in contours: similarity = cv2.matchShapes(ref_contour, cnt, cv2.CONTOURS_MATCH_I1, 0) if similarity < min_similarity: min_similarity = similarity match_contour = cnt # 绘制矩形框 if min_similarity < 0.1: x, y, w, h = cv2.boundingRect(match_contour) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示结果 cv2.imshow("Frame", frame) if cv2.waitKey(1) == ord('q'): break # 释放摄像头并关闭窗口 cap.release() cv2.destroyAllWindows() ``` 需要注意的是,对比边缘特征的方法只是一种简单的实现方式,实际应用中可能需要更复杂的算法来提高准确度。同时,也需要根据实际情况调整阈值等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Risehuxyc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值