我正在尝试检测图像链接中文本的倾斜角度。问题是这篇文章是用 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;
}
我几乎可以肯定问题出在这一行“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());
在这个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 数组只填充了每个像素。
所以。请让我知道我做错了什么。提前致谢。