Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 散乱字符图像的倾斜角度检测_C++_Image_Opencv_Image Processing_Skew - Fatal编程技术网

C++ 散乱字符图像的倾斜角度检测

C++ 散乱字符图像的倾斜角度检测,c++,image,opencv,image-processing,skew,C++,Image,Opencv,Image Processing,Skew,我一直在跟踪以获得图像的倾斜角度。当角色分散在目标图像上时,HoughLinesP似乎正在努力寻找线条 这是我的输入图像: 这是HoughLinesP找到的线条: 这并不是真的得到了大部分的线,我似乎很清楚为什么。这是因为我已将minLineWidth设置为(size.width/2.f)。关键是,由于发现的线很少,所以倾斜角度也是错误的。(-3.15825在这种情况下,它应该接近0.5) 我试图破坏我的输入文件,使字符更接近,在这种情况下,这似乎是可行的,但我不认为这是最好的方法类似的情况

我一直在跟踪以获得图像的倾斜角度。当角色分散在目标图像上时,HoughLinesP似乎正在努力寻找线条

这是我的输入图像:

这是HoughLinesP找到的线条:

这并不是真的得到了大部分的线,我似乎很清楚为什么。这是因为我已将minLineWidth设置为(size.width/2.f)。关键是,由于发现的线很少,所以倾斜角度也是错误的。(-3.15825在这种情况下,它应该接近0.5)

我试图破坏我的输入文件,使字符更接近,在这种情况下,这似乎是可行的,但我不认为这是最好的方法类似的情况

这是我的侵蚀输入图像:

这是HoughLinesP找到的线条:

这一次它发现了-0.2185度的倾斜角,这是我所期望的,但另一方面它正在失去线之间的垂直空间,这在我看来不是一件好事

是否有其他方法对此类图像进行预处理,以使houghLinesP对散乱字符获得更好的效果

以下是我正在使用的源代码:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;


static cv::Scalar randomColor( cv::RNG& rng )
{
  int icolor = (unsigned) rng;
  return cv::Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
}

void rotate(cv::Mat& src, double angle, cv::Mat& dst)
{
    int len = std::max(src.cols, src.rows);
    cv::Point2f pt(len/2., len/2.);
    cv::Mat r = cv::getRotationMatrix2D(pt, angle, 1.0);

    cv::warpAffine(src, dst, r, cv::Size(len, len));
}

double compute_skew(cv::Mat& src)
{
    // Random number generator
    cv::RNG rng( 0xFFFFFFFF );

    cv::Size size = src.size();
    cv::bitwise_not(src, src);
    std::vector<cv::Vec4i> lines;
    cv::HoughLinesP(src, lines, 1, CV_PI/180, 100, size.width / 2.f, 20);
    cv::Mat disp_lines(size, CV_8UC3, cv::Scalar(0, 0, 0));
    double angle = 0.;
    unsigned nb_lines = lines.size();
    for (unsigned i = 0; i < nb_lines; ++i)
    {
        cv::line(disp_lines, cv::Point(lines[i][0], lines[i][1]),
                 cv::Point(lines[i][2], lines[i][3]), randomColor(rng));
        angle += atan2((double)lines[i][3] - lines[i][1],
                       (double)lines[i][2] - lines[i][0]);
    }
    angle /= nb_lines; // mean angle, in radians.

    std::cout << angle * 180 / CV_PI << std::endl;

    cv::imshow("HoughLinesP", disp_lines);
    cv::waitKey(0);

    return angle * 180 / CV_PI;
}
int main()
{
    // Load in grayscale.
    cv::Mat img = cv::imread("IMG_TESTE.jpg", 0);
    cv::Mat rotated;
    double angle = compute_skew(img);
    rotate(img, angle, rotated);
    //Show image
    cv::imshow("Rotated", rotated);
    cv::waitKey(0);
}
#包括
#包括
使用名称空间std;
静态cv::标量随机颜色(cv::RNG和RNG)
{
int icolor=(无符号)rng;
返回cv::Scalar(icolor&255,(icolor>>8)和255,(icolor>>16)和255);
}
空心旋转(cv::Mat和src、双角度、cv::Mat和dst)
{
int len=std::max(src.cols,src.rows);
cv::Point2f pt(len/2.,len/2.);
cv::Mat r=cv::getRotationMatrix2D(pt,角度,1.0);
cv::warpAffine(src,dst,r,cv::Size(len,len));
}
双重计算倾斜(cv::Mat和src)
{
//随机数发生器
cv::RNG RNG(0xFFFFFFFF);
cv::Size Size=src.Size();
cv::按位_not(src,src);
std::矢量线;
cv::HoughLinesP(src,lines,1,cv_PI/180100,size.width/2.f,20);
cv::Mat disp_线(大小,cv_8UC3,cv::标量(0,0,0));
双角度=0。;
无符号nb_行=行。大小();
对于(无符号i=0;istd::cout我建议首先查找单个组件(即行和字母),例如使用
cv::threshold
cv::findContours

然后,您可以删除窄的单个组件(即字母)。例如,您可以使用
cv::floodFill
来执行此操作。这应该只留下线条


实际上,去除字母可能会为Hough变换提供更简单的输入。

尝试将字符组检测为块,然后找到这些块的轮廓。下面我使用模糊、形态学打开和阈值操作来完成

Mat im = imread("yCK4t.jpg", 0);
Mat blurred;
GaussianBlur(im, blurred, Size(5, 5), 2, 2);
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
Mat morph;
morphologyEx(blurred, morph, CV_MOP_OPEN, kernel);
Mat bw;
threshold(morph, bw, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);
Mat cont = Mat::zeros(im.rows, im.cols, CV_8U);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
{
    drawContours(cont, contours, idx, Scalar(255, 255, 255), 1);
}

HoughLinesP需要白色(或非零)像素作为前景,而您的字符和线条是黑色的。嗨,米卡,在我使用HoughLinesP之前,图像正在反转。这也在我提供的源代码中。这是用于反转图像的代码:cv::bitwise_not(src,src);抱歉,根本没有查看您的代码。只看到了被侵蚀的“输入图像”,并假设它用于HoughLinesP;)
HoughLinesP(cont, lines, 1, CV_PI/180, 80, size.width / 4.0f, size.width / 8.0f);