gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:33 24 4
gpt4 key购买 nike

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

我做了 Hugh Transform 的实现。我从 this post 指导我进行了大部分到 java 的转换(1).但它不能正常工作。当应该给出 15.9882 的角度时,给出的角度为 0.27919363。 This是我正在处理的图像。

这是我的代码:

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;
}

我几乎可以肯定问题出在这一行“int nb_lines = lines.cols();”因为原始行是“unsigned nb_lines = lines.size();”,java 没有 jave unsigned 变量,这就是它在 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());

借助这个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));
}
}

但不起作用,永远不会有像素 = 0.0,因此 p 数组只会填满每个像素。

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

最佳答案

这里是计算倾斜角度的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;

关于java - Android 中的 OpenCV 旋转(去偏斜)- C++ 到 Java 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25346712/

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