【问题标题】:OpenCV detecting handwritten equal sign operator wrongOpenCV检测手写等号运算符错误
【发布时间】:2019-04-22 06:24:38
【问题描述】:

我正在尝试使用 OpenCV 库识别手写数学运算符 =,但是,我遇到了它只能识别可以一笔画出的东西的问题。

import cv2
import numpy as np
from PIL import Image, ImageOps



img = cv2.imread("sum.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#Gaussian Blurring to reduce noise
blur = cv2.GaussianBlur(gray, (5,5), 0)

#Adaptive Thresholding to account for different light/shadows
threshed = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)


morphed = cv2.morphologyEx(threshed, cv2.MORPH_OPEN, np.ones((3,3)))

conturs_lst = cv2.findContours(morphed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2]


for cnt in conturs_lst:
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img, (x,y), (x+w, y+h), (255, 0, 255), 1, cv2.LINE_AA)


此代码会导致这种行为,其中等号的两个部分被分隔在单独的框中。

输入图像:

实际输出:

有谁知道如何修改我的代码以允许整个等号位于一个边界框下?

【问题讨论】:

  • 您应该尝试增加变形尺寸的高度(y 轴),例如 15,17,19,21,...,在您的代码中为 3,对于等号的大小。
  • 这种情况下x轴值可以吗?
  • 是的,x-axes 3 就足够了
  • 嗯,它现在可以识别更多的等号,但正在渗入其他边界框:imgur.com/a/3CgOQTw。您还有其他建议吗?
  • 你应该试试这样的:cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 15));我不知道你是怎么尝试的?

标签: python opencv


【解决方案1】:

你可以试试这样的:

cv::namedWindow("result1", cv::WINDOW_FREERATIO);
cv::namedWindow("result2", cv::WINDOW_FREERATIO);
cv::Mat img = cv::imread(R"(FRfLi.png)");

// to gray
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::threshold(gray, gray, 80, 255, cv::THRESH_BINARY_INV);

cv::morphologyEx(gray, gray, cv::MORPH_CLOSE, cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(3, 27)));
cv::imshow("result1", gray);

std::vector<std::vector<cv::Point> > contours;
cv::findContours(gray, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

for (int i = 0; i < contours.size(); ++i) {
    cv::Rect rect = cv::boundingRect(contours[i]);
    rect.x -= 3;
    rect.y -= 3;
    rect.width += 6;
    rect.height += 6;
    cv::rectangle(img, rect, cv::Scalar(0, 0, 255), 2);
}

cv::imshow("result2", img);
cv::waitKey();

变形后你会得到这样的结果:

检测轮廓你会得到这个结果:

注意: 代码是C++,你可以考虑它是如何实现的步骤。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2014-10-21
    相关资源
    最近更新 更多