use*_*239 4 java opencv image-processing
我有这张图片,我已经进行了阈值处理,将其转换为二进制图像和黑白图像.见下图:
我想用一个字母提取每个框,这是通过以下代码完成的:
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(destination3, contours, new Mat(), Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
MatOfPoint2f approxCurve = new MatOfPoint2f();
int x = 1;
//For each contour found
for (int i=0; i<contours.size(); i++)
{
//Convert contours(i) from MatOfPoint to MatOfPoint2f
MatOfPoint2f contour2f = new MatOfPoint2f( contours.get(i).toArray() );
//Processing on mMOP2f1 which is in type MatOfPoint2f
double approxDistance = Imgproc.arcLength(contour2f, true)*0.02;
Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);
//Convert back to MatOfPoint
MatOfPoint points = new MatOfPoint( approxCurve.toArray() );
// Get bounding rect of contour
Rect rect = Imgproc.boundingRect(points);
if(rect.height > 50 && rect.height < 100) {
// draw enclosing rectangle (all same color, but you could use variable i to make them unique)
//Core.rectangle(destination, new Point(rect.x,rect.y), new Point(rect.x+rect.width,rect.y+rect.height), new Scalar(255, 0, 255), 3);
Rect roi = new Rect(rect.x, rect.y, rect.width, rect.height);
Mat cropped = new Mat(destination3, roi);
Highgui.imwrite("letter"+x+".jpg", cropped);
x++;
}
}
Run Code Online (Sandbox Code Playgroud)
但提取的字母完全是黑色的,似乎它填写了白色字母以及下图所示.我该如何解决?我的代码出了什么问题?
来自以下文件findContours()
:(强调我的)
注意:此图像功能会修改源图像.此外,该功能不考虑图像的1像素边界(它填充0并用于算法中的邻域分析),因此将剪切触摸图像边界的轮廓.
你看到的奇怪的图像是修改的结果findContours()
使得对destination3
.您应该能够findContours()
通过调用将数据的深层副本传递给您,从而获得正确的结果clone()
.您调用的findContours()
行将如下所示:
Imgproc.findContours(destination3.clone(), contours, new Mat(), Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
// ^^ Vive la difference!
Run Code Online (Sandbox Code Playgroud)