【问题标题】:How to link Fred's Magick Script TextCleaner with XCode Project如何将 Fred 的 Magick Script TextCleaner 与 XCode 项目链接
【发布时间】:2017-07-20 17:41:22
【问题描述】:

我决定重新表述这个问题。问题来了:

我已经设法在我的 c++ 程序中运行 textcleaner.exe,方法是调用: system("/usr/local/bin/textcleaner g -e normalize -f 25 -o 10 [输入文件路径] [输出文件路径]");

但现在我得到了错误:

/usr/local/bin/textcleaner:第 389 行:转换:找不到命令

/usr/local/bin/textcleaner: 第 400 行: [: : 需要整数表达式

/usr/local/bin/textcleaner:第 403 行:转换:找不到命令

/usr/local/bin/textcleaner: 第 417 行: [: : 预期的整数表达式

/usr/local/bin/textcleaner:第 423 行:[: : 预期的整数表达式

/usr/local/bin/textcleaner:第 429 行:转换:找不到命令

--- 文件 /Users/~/Desktop/kimlik/kimlik1.bmp 不可读或大小为零 ---

那么这里的问题是什么?我给出了正确路径的正确图像,所以我认为问题出在 textcleaner.exe 中的转换命令而不是最后一行。我怎样才能同时调用 textcleaner.exe 和 convert.exe so 在运行 textcleaner.exe 时,它​​知道 convert 命令是什么?

【问题讨论】:

  • 它们是脚本而不是 .exe 文件
  • 所以如果你在脚本上使用 chmod u+x textcleaner 你会得到可执行文件。我知道您可以使用 system(textcleaner [parameters] inputfile outputfile) 在 c++ 代码中调用 exec 版本。但是运行它会给出错误: textcleaner: line 389: convert: command not found。我想我也需要以某种方式添加转换可执行文件,但我不知道如何。
  • 首先:convert 实用程序不在您的环境PATH 中。您需要加载 shell 环境,或使用putenv 重建PATH。第二:[ 字符是一个测试实用程序,不能用作文字字符串。请参阅man [ 了解更多信息。
  • 只是看看我是否理解这一点:在 .bash/profile 中将 convert.exe 的路径添加到我的 PATH 还不够吗?因为我的 PATH 包括 usr/local/bin,convert.exe 与 textcleaner 一起驻留在其中
  • 我的脚本是 bash Unix shell 脚本 (.sh) 而不是 Windows 可执行文件 (.exe)。要在 Window 上运行它,您需要一个 Unix 环境,例如 Windows 10 unix 或 Cygwin。也不要将 Windows 转换与 Imagemagick 转换混淆。大部分脚本只是使用 Imagemagick 的 -lat 命令。

标签: xcode image-processing imagemagick ocr


【解决方案1】:

我不建议从 C++ 应用程序调用外部脚本。您需要担心路径、加载 shell 环境和外部错误处理。不是很难做到,但我觉得没必要。我认为,如果您开发 C++ 解决方案,不如直接与 Magick++ 集成。试试下面...

确保您安装了支持 Magick++ 的 ImageMagick。这通常默认启用。

更新 Xcode 的 Build Settings 以包含 Magick++ 标志。

  • 在终端中运行Magick++-config --cxxflags。返回值应复制到“Other C++ Flags”选项下。
  • 在终端中运行Magick++-config --libs。返回值应复制到“Other Linker Flags”选项下。

Xcode 项目现在应该支持 Magick++ 库。

最后,评估 Fred 出色的textcleaner 脚本的来源。您应该能够直接在 C++ 中模仿他的技术。

例如。该脚本可能会生成以下转换命令。

 convert \( $infile -colorspace gray -type grayscale -contrast-stretch 0 \) \
         \( -clone 0 -colorspace gray -negate -lat ${filtersize}x${filtersize}+${offset}% -contrast-stretch 0 \) \
         -compose copy_opacity -composite -fill "$bgcolor" -opaque none  \
         -sharpen 0x1 \ $outfile

这可以用类似...的东西来实现

#include <Magick++.h>

using namespace Magick;

int main(int argc, const char * argv[]) {
    long
        filtersize = 15,
        offest = 5;
    const char
        * bgcolor = "white",
        * infile  = "wizard:",
        * outfile = "output.png";

    InitializeMagick(argv[0]);
    Image alphaImage(infile);
    alphaImage.colorSpaceType(GRAYColorspace);
    alphaImage.type(GrayscaleType);
    alphaImage.contrastStretch(0, QuantumRange);
    Image betaImage(alphaImage);
    betaImage.negate();
    betaImage.adaptiveThreshold(filtersize, filtersize, offest);
    betaImage.contrastStretch(0, QuantumRange);
    alphaImage.composite(betaImage, 0, 0, CopyAlphaCompositeOp);
    alphaImage.fillColor(Color(bgcolor));
    alphaImage.opaque(Color("none"), Color(bgcolor));
    alphaImage.sharpen();
    alphaImage.write(outfile);
    return 0;
}

【讨论】:

  • 感谢您的详细解答。 Magick++ 库已经与我的项目相关联。我认为 textcleaner 脚本的来源是指脚本末尾的转换命令,我发现它很难复制,因为它需要对每个图像处理步骤有很好的理解。 (有很多步骤)。理论上可以从 c++ 调用外部脚本吗?我真的很想了解为什么我会收到错误。如果我不能克服这个问题,我会听从你的建议
  • 你认为以下是 textcleaner 的源转换命令吗: convert -respect-parenthesis ( $tmpA1 $rotation $cropping $makegray $enhancing ) \ ( -clone 0 $setcspace -colorspace gray -negate -lat ${filtersize}x${filtersize}+${offset}% -contrast-stretch 0 $blurring ) \ -compose copy_opacity -composite -fill "$bgcolor" -opaque none -alpha off \ $unrotating $sharpening $modulation $adaptiveblurring $trimming $padding \ "$outfile"
猜你喜欢
  • 1970-01-01
  • 2017-10-06
  • 2023-03-19
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
相关资源
最近更新 更多