[英]OpenCV Rotation (Deskewing) in Android - C++ to Java Conversion
我正在嘗試檢測圖像鏈接中文本的偏斜角。 問題是這篇文章是用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數組只會填充每個像素。
所以。 請讓我知道我在做什么錯。 提前致謝。
這是計算偏斜角的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代碼:
Mat deskew(Mat src, double angle) {
Point center = new Point(src.width()/2, src.height()/2);
Mat rotImage = Imgproc.getRotationMatrix2D(center, angle, 1.0);
//1.0 means 100 % scale
Size size = new Size(src.width(), src.height());
Imgproc.warpAffine(src, src, rotImage, size, Imgproc.INTER_LINEAR + Imgproc.CV_WARP_FILL_OUTLIERS);
return src;
}
角度應以弧度而不是度為單位。
這可以使用tess4j類實現,例如ImageDeskew和ImageHelper
ImageDeskew imgdeskew=new ImageDeskew(img); // BufferedImage img
ImageHelper.rotateImage(bim, -imgdeskew.getSkewAngle()); // rotateImage static method
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.