OpenCV C ++ код для Obj-C ++

0

Мне предложили алгоритм для подготовки изображения для OCR, код, предоставляемый мне, замечательный! Однако он несовместим с iOS-сборкой OpenCV, похоже, существует несколько различных соглашений об именах, и мне сложно преобразовать код в Obj-С++. Может ли кто-нибудь переписать его для Obj-С++?

Вот исходный код:

#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdarg.h>
#include "opencv2/opencv.hpp"
#include "fstream"
#include "iostream"
using namespace std;
using namespace cv;

//-----------------------------------------------------------------------------------------------------
// 
//-----------------------------------------------------------------------------------------------------
void CalcBlockMeanVariance(Mat& Img,Mat& Res,float blockSide=21) // blockSide - the parameter (set greater for larger font on image)
{
    Mat I;
    Img.convertTo(I,CV_32FC1);
    Res=Mat::zeros(Img.rows/blockSide,Img.cols/blockSide,CV_32FC1);
    Mat inpaintmask;
    Mat patch;
    Mat smallImg;
    Scalar m,s;

    for(int i=0;i<Img.rows-blockSide;i+=blockSide)
    {       
        for (int j=0;j<Img.cols-blockSide;j+=blockSide)
        {
            patch=I(Range(i,i+blockSide+1),Range(j,j+blockSide+1));
            cv::meanStdDev(patch,m,s);
            if(s[0]>0.01) // Thresholding parameter (set smaller for lower contrast image)
            {
                Res.at<float>(i/blockSide,j/blockSide)=m[0];
            }else
            {
                Res.at<float>(i/blockSide,j/blockSide)=0;
            }           
        }
    }

    cv::resize(I,smallImg,Res.size());

    cv::threshold(Res,inpaintmask,0.02,1.0,cv::THRESH_BINARY);

    Mat inpainted;
    smallImg.convertTo(smallImg,CV_8UC1,255);

    inpaintmask.convertTo(inpaintmask,CV_8UC1);
    inpaint(smallImg, inpaintmask, inpainted, 5, INPAINT_TELEA);

    cv::resize(inpainted,Res,Img.size());
    Res.convertTo(Res,CV_32FC1,1.0/255.0);

}
//-----------------------------------------------------------------------------------------------------
// 
//-----------------------------------------------------------------------------------------------------
int main( int argc, char** argv )
{
    namedWindow("Img");
    namedWindow("Edges");
    //Mat Img=imread("D:\\ImagesForTest\\BookPage.JPG",0);
    Mat Img=imread("Test2.JPG",0);
    Mat res;
    Img.convertTo(Img,CV_32FC1,1.0/255.0);
    CalcBlockMeanVariance(Img,res); 
    res=1.0-res;
    res=Img+res;
    imshow("Img",Img);
    cv::threshold(res,res,0.85,1,cv::THRESH_BINARY);
    cv::resize(res,res,cv::Size(res.cols/2,res.rows/2));
    imwrite("result.jpg",res*255);
    imshow("Edges",res);
    waitKey(0);

    return 0;
}

Моя попытка: (возвращает синее изображение с черными пятнами)

void CalcBlockMeanVariance(cv::Mat& Img,cv::Mat& Res,float blockSide=21) // blockSide - the parameter (set greater for larger font on image)
{
    cv::Mat I;
    Img.convertTo(I,CV_32FC1);
    Res=cv::Mat::zeros(Img.rows/blockSide,Img.cols/blockSide,CV_32FC1);
    cv::Mat inpaintmask;
    cv::Mat patch;
    cv::Mat smallImg;
    cv::Scalar m,s;

    for(int i=0;i<Img.rows-blockSide;i+=blockSide)
    {
        for (int j=0;j<Img.cols-blockSide;j+=blockSide)
        {
             patch=I(cv::Rect(j,i,blockSide,blockSide));
            cv::meanStdDev(patch,m,s);
            if(s[0]>0.01) // Thresholding parameter (set smaller for lower contrast image)
            {
                Res.at<float>(i/blockSide,j/blockSide)=m[0];
            }else
            {
                Res.at<float>(i/blockSide,j/blockSide)=0;
            }
        }
    }

    cv::resize(I,smallImg,Res.size());

    cv::threshold(Res,inpaintmask,0.02,1.0,CV_THRESH_BINARY);

    cv::Mat inpainted;
    smallImg.convertTo(smallImg,CV_8UC1,255);

    inpaintmask.convertTo(inpaintmask,CV_8UC1);
    inpaint(smallImg, inpaintmask, inpainted, 5, CV_INPAINT_TELEA);

    cv::resize(inpainted,Res,Img.size());
    Res.convertTo(Res,CV_32FC1,1.0/255.0);

}

Вызов метода.

_img = [self cvMatFromUIImage:_endImage];
cv::cvtColor(_img, _img, CV_RGB2GRAY);
_img.convertTo(_img, CV_32FC1, 1.0/255.0);
CalcBlockMeanVariance(_img, _res);
_res = 1.0 - _res;
_res = _img + _res;
cv::threshold(_res,_res,0.85,1,cv::THRESH_BINARY);
cv::resize(_res,_res,cv::Size(_res.cols/2,_res.rows/2));

_endImage = [self UIImageFromMat:_res];
Теги:
opencv

1 ответ

0

Вы можете просто отделить ваш c++ код в другом NSObject class NSObject и переименовать имя файла в OpenCVUtilities.mm из OpenCVUtilities.m. mm предлагает Objective -C, чтобы использовать c++ complier для класса, и вам не нужно преобразовывать код в Objective -C для этого, он будет работать так, как есть.

И после этого вам нужно будет изменить несколько настроек в вашем проекте → Настройки сборки, как показано на изображении ниже

Изображение 174551

Изображение 174551

Для получения дополнительной информации вы можете скачать проект здесь

Приветствия.

  • 0
    Спасибо за ответ, я сейчас компилирую в файл .mm и обновил настройки сборки, и у меня все еще много ошибок, похоже, что соглашение об именах для платформы iOS немного отличается. Я обновлю свой пост несколькими фотографиями.
  • 1
    Проверьте с примерами приложений для iOS и предоставленную мной ссылку, все, что вам нужно, правильные настройки сборки и все необходимые рамки, которые должны быть включены, это должно работать ..
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню