Android 中的 OpenCV 旋转(去偏斜) - C++ 到 Java 的转换

Mau*_*cio 0 c++ java android opencv skew

我正在尝试检测图像链接中文本的倾斜角度。问题是这篇文章是用 C++ 编写的,我在将某些内容转换为 Java 时遇到了麻烦。

我做了休变换的实现。我在这篇文章(1) 中指导我的大部分 Java 转换。但它不能正常工作。当应该给出 15.9882 的角度时,给出的角度为 0.27919363。是我正在使用的图像。

这是我的代码:

public double compute_skew1(String filename){
    Log.d(TAG, "Computing skew 1");

    Mat src = Highgui.imread(filename, 0);
    Size size = src.size();
    //double minLineSize = 20;
    double minLineSize = src.width() / 2.f;

    Core.bitwise_not(src, src);

    Mat lines = new Mat();
    double angle = 0.;
    try {
        Imgproc.HoughLinesP(src, lines, 1, Math.PI / 180, 100, minLineSize, 20);

        Mat disp_lines = new Mat(size, CvType.CV_8UC1, new Scalar(0, 0, 0));
        int nb_lines = lines.cols();
        for (int i = 0; i < nb_lines; i++) {
            double[] vec = lines.get(0, i);
            double x1 = vec[0], 
                   y1 = vec[1],
                   x2 = vec[2],
                   y2 = vec[3];
            Point start = new Point(x1, y1);
            Point end = new Point(x2, y2);
            Core.line(disp_lines, start, end, new Scalar(255,0,0));
            angle += Math.atan2(y2 - y1, x2 - x1);
        }
        angle /= nb_lines; // mean angle, in radians.*/
        //Log.d(TAG, "ANGLE: "+angle);
        Log.d(TAG, "ANGLE: "+ angle * 180 / Math.PI);
    } catch (Exception e) {
        Log.e(TAG, "Error in compute_skew1");
        Log.e(TAG, e.getMessage());
    }

    return angle;
}
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定问题出在这一行“int nb_lines = lines.cols();” 由于原始行是“unsigned nb_lines = lines.size();”,java 不包含无符号变量,这就是它在 post(1) 中的工作方式。另外,我不太明白这一行“double[] vec = lines.get(0, i);” 但这也是它在帖子(1)中的工作方式。我究竟做错了什么?

还有,在我得到角度后,我需要对文本进行旋转或纠偏,而且我在这种转换上也遇到了一些麻烦,尤其是这部分代码:

std::vector<cv::Point> points;
cv::Mat_<uchar>::iterator it = img.begin<uchar>();
cv::Mat_<uchar>::iterator end = img.end<uchar>();
for (; it != end; ++it)
if (*it)
  points.push_back(it.pos());
Run Code Online (Sandbox Code Playgroud)

在这篇post2的帮助下,我相信这是转换:

List <Point> points = new ArrayList<Point>();
for (int i = 0; i < img.rows(); i++) {
    for (int j = 0; j < img.cols(); j++) {
        double pixel = img.get(i, j)[0];
        if (pixel != 0.0)
            points.add(new Point(i,j));
    }
}
Run Code Online (Sandbox Code Playgroud)

但不起作用,从来没有一个像素 = 0.0,所以 p 数组只是用每个像素填充。

所以。请让我知道我做错了什么。提前致谢。

bod*_*man 5

这是计算倾斜角度的java代码:

    Mat source = Imgcodecs.imread(input.getName(),0);
    Size size = source.size();
    Core.bitwise_not(source, source);
    Mat lines = new Mat();
    Imgproc.HoughLinesP(source, lines, 1, Math.PI / 180, 100, size.width / 2.f, 20);
    double angle = 0.;
    for(int i = 0; i<lines.height(); i++){
        for(int j = 0; j<lines.width();j++){
            angle += Math.atan2(lines.get(i, j)[3] - lines.get(i, j)[1], lines.get(i, j)[2] - lines.get(i, j)[0]);
        }
    }
    angle /= lines.size().area();
    angle = angle * 180 / Math.PI;
Run Code Online (Sandbox Code Playgroud)