当前位置: 首页 > 知识库问答 >
问题:

如何将此图像处理从Matlab转换为OpenCV?

黄浩涆
2023-03-14

下面的链接使用Matlab从图像中删除非文本内容。我想在Java中使用OpenCV做同样的事情。

我没有Matlab可供尝试,而且我对OpenCV还是新手。虽然我知道这个过程背后的一些基本理论,但要把Matlab语言翻译成OpenCV 3.0有点困难。最好是用Java。

http://www.mathworks.com/help/vision/examples/automatically-detect-and-recognize-text-in-natural-images.html

对于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);
}

}

但是我不知道如何将关键点转换为区域。我需要的是下面:

一旦我能够找到MSER区域,我就应该将其与精明的边缘相交。我可以找到一些精明的边缘如下。但我不知道如何进行交叉操作。

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

要使用VS2013设置OpenCV,请点击此处。

下面是我现在尝试的关于这里的内容。

//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);

我得到的是:

我刚刚按照Miki的建议尝试了文本检测示例。它需要一些训练有素的模型文件来运行。它花了将近2分钟才完成,但我们可以稍后离开表演。我的场景是从复杂的屏幕截图中获取OCR文本(抱歉直到现在才透露)。尽管结果对于自然场景相当好。它对屏幕截图不太有吸引力。以下是结果:

共有1个答案

越俊驰
2023-03-14

作为答案发布,只是为了显示OpenCV文本检测示例的结果

现在,您需要应用文本识别,例如使用OCRHMMDecoder

你可以在这里找到样品

 类似资料:
  • 问题内容: 我正在尝试使用以下代码将Icon()转换为Image(): 问题是,函数在上抛出。 对于记录,该值为默认图标(通过获取) 以下是引发异常的详细信息: 如果您需要更多详细信息,请告诉我,我将编辑我的信息以添加它们。 谢谢! 问题答案: 刚刚找到了一个代码段,如果您想更频繁地包装那些表现不佳的LAF提供的图标,可能会有所帮助: 要在您的代码段中使用,只需传递任意组件:

  • 问题内容: 我想将UIView转换为图像并将其保存在我的应用程序中。有人可以告诉我如何拍摄视图的屏幕截图或将其转换为图像,以及将其保存在应用程序(而不是相机胶卷)中的最佳方法是什么?这是该视图的代码: 问题答案: 例如,如果我有一个尺寸视图:100 100时50 50。我可以使用以下屏幕截图:

  • 我想把openCV Mat文件转换成GDI+位图图像。我找不到任何关于如何做到这一点的信息?

  • 我想从解析中检索图像。com数据库到处理草图。可能吗?从哪里开始?找不到任何关于它的信息。

  • 我有一个双重形象,我的目标是把它转换成逻辑。我想创建5x5窗口,并把它放在图像中的每个像素上。然后,我计算这25个像素的平均值。如果中心像素值大于平均值,则为1。否则为0。 我怎么能那样做? 附注。我不想这样做:

  • 问题内容: 我正在尝试将图像从转换为格式。我正在使用。这是到目前为止我一直尝试的。 但我认为图像未转换为CV格式。窗口向我显示了一个大的棕色图像。将图像从转换为格式时,我在哪里出错? 另外,为什么我需要输入访问功能? 问题答案: 用这个: