python-opencv画矩形并计算面积
时间: 2023-08-18 10:12:59 浏览: 431
您可以使用Python中的OpenCV库来画矩形并计算其面积。下面是一个示例代码:
```python
import cv2
# 创建一个黑色的图像
image = np.zeros((500, 500, 3), dtype=np.uint8)
# 定义矩形的左上角和右下角坐标
start_point = (100, 100)
end_point = (400, 400)
# 画矩形
cv2.rectangle(image, start_point, end_point, (0, 255, 0), 2)
# 计算矩形的面积
width = end_point[0] - start_point[0]
height = end_point[1] - start_point[1]
area = width * height
# 显示图像和矩形的面积
cv2.imshow("Rectangle", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
print("矩形的面积:", area)
```
在这个示例中,我们首先创建了一个黑色的图像。然后,我们定义了矩形的左上角和右下角坐标,并使用`cv2.rectangle`函数在图像上画了一个绿色的矩形。最后,我们计算矩形的宽度和高度,并将其相乘以得到面积,并将其打印出来。
请确保您已经安装了OpenCV库,并将其导入到您的代码中。
相关问题
python-opencv答题卡识别
### 使用 Python 和 OpenCV 进行答题卡识别
#### 预处理阶段
为了提高后续处理的效果,在开始之前要对输入的答题卡图像做一系列预处理工作。这包括但不限于将彩色图转换成灰度图,通过二值化使图像黑白分明,并去除可能存在的噪声干扰。
```python
import cv2
import numpy as np
def preprocess_image(image_path):
# 加载原始图像并转为灰度模式
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 应用高斯模糊减少噪音
blurred = cv2.GaussianBlur(image, (5, 5), 0)
# 自适应阈值法进行二值化处理
thresh = cv2.adaptiveThreshold(blurred, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY_INV, 11, 2)
return thresh
```
此部分的操作能够有效提升之后轮廓查找以及特征提取的质量[^1]。
#### 轮廓检测与定位
经过初步清理后的图像更易于分析其几何特性。接下来的任务是从中找出代表答题区域的关键形状——通常是矩形框内的选项标记。为此,先寻找整个页面上的所有闭合边界,再从中筛选出最有可能属于答题区的部分。
```python
def find_contours(thresh_img):
contours, _ = cv2.findContours(thresh_img.copy(),
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
contour_data = []
for c in contours:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
if len(approx) == 4: # 只考虑四边形作为候选对象
contour_data.append((approx, cv2.contourArea(approx)))
sorted_contours = sorted(contour_data, key=lambda x:x[1], reverse=True)[:5]
return [c[0] for c in sorted_contours]
```
上述函数会返回按面积大小排列前五名的疑似答题区位置信息列表[^3]。
#### 图像矫正(透视变换)
一旦确定了潜在的目标区域,则可以通过计算四个角点之间的关系来进行视角校正,从而获得更加规整的标准视图用于下一步解析。
```python
def four_point_transform(image, pts):
rect = order_points(pts.reshape(4, 2))
(tl, tr, br, bl) = rect
widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max(int(widthA), int(widthB))
heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max(int(heightA), int(heightB))
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maxHeight - 1],
[0, maxHeight - 1]], dtype="float32")
M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
return warped
def order_points(pts):
rect = np.zeros((4, 2), dtype="float32")
s = pts.sum(axis=1)
rect[0] = pts[np.argmin(s)]
rect[2] = pts[np.argmax(s)]
diff = np.diff(pts, axis=1)
rect[1] = pts[np.argmin(diff)]
rect[3] = pts[np.argmax(diff)]
return rect
```
这段代码实现了基于选定角落坐标的精确变形调整过程。
---
使用python-opencv写一段识别银行卡数字的代码
以下是使用Python OpenCV库实现银行卡数字识别的示例代码:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取银行卡图像
img = cv2.imread('bank_card.jpg')
# 将图像转化为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 将灰度图像进行二值化处理
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 对二值化图像进行形态学操作,去除噪点
kernel = np.ones((3,3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# 找到轮廓
contours, hierarchy = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 循环遍历每个轮廓
for contour in contours:
# 计算轮廓面积
area = cv2.contourArea(contour)
if area < 100:
continue
# 找到轮廓的外接矩形
x, y, w, h = cv2.boundingRect(contour)
# 裁剪出数字图像
digit_roi = opening[y:y+h, x:x+w]
# 调整数字图像大小
resized_digit_roi = cv2.resize(digit_roi, (28, 28))
# 将数字图像转化为 MNIST 数据集的格式
mnist_digit = resized_digit_roi.reshape(1, 28, 28, 1).astype('float32') / 255.0
# 使用训练好的模型进行数字识别
prediction = model.predict(mnist_digit)
digit = np.argmax(prediction)
# 在原图像上绘制识别结果
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(img, str(digit), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
# 显示结果图像
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
```
该代码使用了OpenCV库对银行卡数字进行了识别。其中,首先读取了银行卡图像,然后将图像转化为灰度图像,再进行二值化处理,去除噪点,找到数字轮廓,裁剪数字图像,将数字图像转化为MNIST数据集的格式,使用训练好的模型进行数字识别,最后在原图像上绘制识别结果。需要注意的是,该代码中的模型需要自己训练或者使用已经训练好的模型进行识别。
阅读全文