gpt4 book ai didi

c++ - 从图像中获取数字

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:58 26 4
gpt4 key购买 nike

enter image description here

enter image description here

enter image description here

enter image description here

在这里,我试图取出相同大小的 block ,以便为 OCR 应用程序准备好数字

第一次尝试通过固定步长移动的小代码,但由于数字之间的空格,它在某些位置跳得很高,主要问题是最后 5 位数字,有时它们是 2 个数字,空格然后是 3 个数字,有时它们是 3 个数字,空格然后是 2 个数字,如果 5 个数字很大,最后可能是 5 个数字

第二次尝试我使用了 FindContour,当它找到对象时,我调整了矩形的大小以适合它,但问题是它没有按从左到右或相反的顺序给我数字。

那我该如何处理呢?

第一次尝试:

void DetectEqualRectangles(Mat image){
resize(image,image,Size(810,52));
int k=0;
for(int i=0;i<14;i++){
rectangle(image,Point(k,0),Point(45+k,52),Scalar(0,0,255),1,8,0);
imshow("1",image);
waitKey(0);
if(i==0){k+=70;}
else if(i==2){k+=71;}
else if(i==4){k+=75;}
else if(i==6){k+=78;}
else if(i==8){k+=76;}
else{k+=50;}
}}

第二次尝试:

void DetectUsingContours(Mat image){
resize(image,image,Size(810,52));
Mat gray;int BrightnessIndicator=0;
cvtColor(image,gray,CV_BGR2GRAY);

GaussianBlur(gray,gray,Size(5,5),3,0); // applying a gaussianBlur
BrightnessIndicator=EstimateBrighteness(image); // getting the approximate value for the brightness

cout<<BrightnessIndicator<<endl;
threshold(gray,gray,BrightnessIndicator-33,255,CV_THRESH_BINARY_INV); //thresholding
imshow("s",gray);

vector< vector<Point> > Contour;
findContours(gray,Contour,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE); //finding outer contours
cout<<Contour.size();
for(int i=0;i<Contour.size();i++){

Rect bounding = boundingRect(Contour[i]); // draw a rectangle
if(bounding.x>15 && bounding.x<image.cols-50){bounding.x-=15;bounding.width=50;}
else if(bounding.x>image.cols-50){bounding.x=image.cols-40;bounding.width=40;}
else{bounding.x=0;bounding.width=50;}


bounding.y-=bounding.y;
bounding.height=image.rows;
// rectangle(image,bounding,Scalar(0,255,0),1,8,0);

Mat CroppedImage=image(bounding);
stringstream ss;
ss<<"C:\\Users\\cdc\\Desktop\\GSC\\ExtractingNumbers\\"<<i<<".jpg";
imwrite(ss.str(),CroppedImage);
imshow("5",image);
imshow("23",CroppedImage);
waitKey(0);
}}

这是原始图像: enter image description here

enter image description here

enter image description here

enter image description here

最佳答案

只需按 std::sort 对结果进行排序

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

#include <algorithm>
#include <iostream>
#include <sstream>

using namespace cv;
using namespace std;

void DetectUsingContours(Mat &image)
{
resize(image,image,Size(810,52));
Mat gray;
cvtColor(image,gray,CV_BGR2GRAY);

GaussianBlur(gray,gray,Size(5,5),3,0); // applying a gaussianBlur
threshold(gray, gray,0, 255,
CV_THRESH_BINARY_INV | CV_THRESH_OTSU); //thresholding
imshow("s",gray);

vector< vector<Point> > Contour;
findContours(gray,Contour,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE); //finding outer contours
cout<<Contour.size();
std::vector<cv::Rect> rects;
for(size_t i=0;i<Contour.size();i++){

Rect bounding = boundingRect(Contour[i]); // draw a rectangle
if(bounding.x>15 && bounding.x<image.cols-50){bounding.x-=15;bounding.width=50;}
else if(bounding.x>image.cols-50){bounding.x=image.cols-40;bounding.width=40;}
else{bounding.x=0;bounding.width=50;}

bounding.y-=bounding.y;
bounding.height=image.rows;
rects.emplace_back(bounding);
}

auto func = [](cv::Rect const &lhs, cv::Rect const &rhs)
{
return lhs.x < rhs.x;
};
std::sort(std::begin(rects), std::end(rects), func);
for(size_t i = 0; i != rects.size(); ++i){
Mat CroppedImage=image(rects[i]);
stringstream ss;
ss<<"C:/Users/cdc/Desktop/GSC/ExtractingNumbers/"<<i<<".jpg";
imwrite(ss.str(),CroppedImage);
imshow("5",image);
imshow("23",CroppedImage);
waitKey(0);
}
}

int main()
{
DetectUsingContours(cv::imread("tVVEl.jpg"));

return 0;
}

我用自适应阈值做阈值,你不需要自己估计亮度。

关于c++ - 从图像中获取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32262667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com