下面的链接使用Matlab从图像中删除非文本内容.我想用
Java中的OpenCV做同样的事情.
我没有Matlab可以尝试,我是OpenCV的新手.虽然我对这个过程背后的理论有了一些基础知识,但是很难将Matlab语言翻译成OpenCV 3.0.最好是用Java.
添加1 – 使用MSER进行区域检测(尚未解决)
对于MSER检测,我可以使用以下代码来检测MSER关键点.
public static void MSERdetector(String imgName1, String suffix1) {
Mat imgMat1 = Imgcodecs.imread(picDir + imgName1 + "." + suffix1, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
String outImgName1 = picDir + "MSER" + "_keypoints_" + imgName1 + "_" + ".tif";
Mat outImg1 = new Mat();
FeatureDetector featureDetector = FeatureDetector.create(FeatureDetector.MSER); // create the feature detector
MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
featureDetector.detect(imgMat1, keypoints1);
if (!keypoints1.empty()) {
Features2d.drawKeypoints(imgMat1, keypoints1, outImg1);
Imgcodecs.imwrite(outImgName1, outImg1);
System.out.println("done");
}
else {
System.out.println("No keypoints found for: " + imgName1);
}
}
输出看起来像这样:
但我不知道如何将关键点转换为区域.我需要的是以下内容:
ADD 2 – Canny边缘和与MSER区域的交叉点(尚未解析)
一旦我能够找到MSER区域,我应该将它与Canny边缘相交.我可以找到一些Canny边缘如下.但我不知道如何进行交叉口操作.
public static void CANNYedge(String imgName1, String suffix1) {
Mat imgMat1 = Imgcodecs.imread(picDir + imgName1 + "." + suffix1, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
//imgMat1 = ImageUtilities.Convert2BW(imgMat1);
String outImgName1 = picDir + "_CANNY_" + imgName1 + ".tif";
Mat outImg1 = new Mat();
Imgproc.Canny(imgMat1, outImg1, 0, 500);
Imgcodecs.imwrite(outImgName1, outImg1);
}
我的canny边缘输出如下所示:
添加3 – 现在我转向使用VS 2013社区
要使用VS2013设置OpenCV,请检查here.
ADD 4 – VC 2013中的编码
以下是我现在参考here尝试的内容.
//Step2: Detect MSER regions
Mat grayImage;
cvtColor(colorImage, grayImage, CV_BGR2GRAY);
imshow("Gray Image", grayImage);
waitKey(0);
Ptr<MSER> mserExtractor = MSER::create(); // create MSER extractor with default parameters. http://code.opencv.org/projects/opencv/wiki/MSER http://docs.opencv.org/master/d3/d28/classcv_1_1MSER.html#a49d72a1346413106516a7fc6d95c09bb
mserExtractor->setMinArea(150);
mserExtractor->setMaxArea(2000);
//Mat mserOutMask = Mat::zeros(grayImage.rows, grayImage.cols, CV_8UC3);
Mat vis;
//vis = Mat::zeros(grayImage.rows, grayImage.cols, CV_8UC3);
grayImage.copyTo(vis);
vector<vector<Point>> mserContours;
vector<Rect> mserBBox;//what's this?
mserExtractor->detectRegions(grayImage, mserContours, mserBBox);
for (int i = 0; i<mserContours.size(); i++)
{
drawContours(vis, mserContours, i, Scalar(255, 255, 255), 4);
}
imshow("MSER by contours", vis);
waitKey(0);
Mat vis2;
grayImage.copyTo(vis2);
for (vector<cv::Point> v : mserContours){
for (cv::Point p : v){
vis2.at<uchar>(p.y, p.x) = 255;
}
}
imshow("MSER by points", vis);
waitKey(0);
我得到的是这些:
vis1 – MSER按轮廓绘制
vis2 – 点数MSER
添加5
我只是按照Miki的建议试验了text detection sample.
它需要一些训练有素的模型文件来运行.它花了将近2分钟才完成,但我们可以稍后离开.我的场景是来自复杂截图的OCR文本(很遗憾地透露到目前为止).虽然结果非常适合自然场景.屏幕截图并不那么吸引人.结果如下:
最佳答案 张贴作为答案只是为了显示OpenCV
text detection example的结果
现在您需要应用文本识别,例如使用OCRHMMDecoder
你会找到一个样本here