如何通过内置的OcrEngine类检测数字/数字

时间:2016-05-15 19:56:40

标签: windows multithreading win-universal-app ocr c++-cx

使用C ++ / CX的Windows UWP OCR-Engine检测图像中的数字/数字时遇到麻烦。 我需要检测以下图像中的数字

Digit

我使用Windows 10 UWP的内置方法尝试了它:OcrEngine,代码如下:

...
cv::Mat croppedImage = imread("digit.png");
WriteableBitmap^ bit1 = ref new WriteableBitmap(croppedImage.cols, croppedImage.rows);
SoftwareBitmap^ bit2 = bit2->CreateCopyFromBuffer(bit1->PixelBuffer, BitmapPixelFormat::Bgra8, bit1->PixelWidth, bit1->PixelHeight);
Windows::Globalization::Language^ l = ref new Windows::Globalization::Language("de");
OcrEngine^ ocrEngine = OcrEngine::TryCreateFromLanguage(l);
IAsyncOperation<OcrResult^>^ ao = ocrEngine->RecognizeAsync(bit2);
task_completion_event<Platform::String^> purchaseCompleted;
auto deviceEnumTask = create_task(ao);
deviceEnumTask.then([this](OcrResult^ result)
{
App1::MainPage::findNumber(result->Text);
});
...
void App1::MainPage::findNumber(Platform::String^ text)
{
//Do something with String
}

我的问题是,findNumber中插入的字符串始终为空。我尝试使用不同的图片作为输入但总是相同的结果:NULL。

  1. 在C ++ / CX中有更简单的方法来获取此图像中的数字吗?
  2. 可能是什么问题?转换图像?

1 个答案:

答案 0 :(得分:1)

问题是将WriteableBitmap转换为SoftwareBitmap WriteableBitmap ^ bit1 = ref new WriteableBitmap(croppedImage.cols,croppedImage.rows);             //访问像素             IBuffer ^ buffer = bit1-&gt; PixelBuffer;             unsigned char * dstPixels;

        // Obtain IBufferByteAccess
        ComPtr<IBufferByteAccess> pBufferByteAccess;
        ComPtr<IInspectable> pBuffer((IInspectable*)buffer);
        pBuffer.As(&pBufferByteAccess);

        // Get pointer to pixel bytes
        pBufferByteAccess->Buffer(&dstPixels);
        memcpy(dstPixels, croppedImage.data, croppedImage.step.buf[1] * croppedImage.cols*croppedImage.rows);
        SoftwareBitmap^ bit2= ref new SoftwareBitmap(BitmapPixelFormat::Bgra8, croppedImage.cols, croppedImage.rows);
        //SoftwareBitmap^ bit2 = 
        bit2->CopyFromBuffer(bit1->PixelBuffer);