Beispiel #1
0
 public void RunRecognize(MemoryBlock pdImage0, MemoryBlock pdImage1, int nLineWidth0, int nLineWidth1, int nNumOfLines0, int nNumOfLines1)
 {
     lock (s_runSync)
     {
         s_runRecCount++; // увеличиваю количество вызовов функции
         if (pdImage0 == null || pdImage1 == null)
         {
             SetError(ErrorCode.IllegalUse, "RunRecognize: переданы нулевые указатели на изображения");
             throw new OcrException("RunRecognize: переданы нулевые указатели на изображения");
         }
         IntPtr buffer0 = pdImage0.ToPointer();
         IntPtr buffer1 = pdImage1.ToPointer();
         if (buffer0 == IntPtr.Zero || buffer1 == IntPtr.Zero)
         {
             SetError(ErrorCode.UnexpectedError, "RunRecognize: получены нулевые указатели на изображения");
             throw new OcrException("RunRecognize: получены нулевые указатели на изображения");
         }
         _side0.all_bin_buf = IntPtr.Zero;
         _side0.bin_buf = buffer0;
         _side0.bin_size = (uint) (nNumOfLines0*nLineWidth0);
         _side0.ByteImageWidth = nLineWidth0;
         _side0.ImageWidth = nLineWidth0*8;
         _side0.ActualScanNumber = nNumOfLines0;
         _side0.tone_buf = IntPtr.Zero;
         _side0.bin_width = 0;
         _side0.size = 0;
         _side0.tone_size = 0;
         _side0.g_p0.len = 0;
         _side0.g_p0.start = 0;
         _side0.g_p1.len = 0;
         _side0.g_p1.start = 0;
         _side0.g_p2.len = 0;
         _side0.g_p2.start = 0;
         _side0.flag = 0;
         _side0.ScanCounter = 0;
         _side0.OutFlag = 0;
         _side0.LineCount = 0;
         _side0.xl = 0;
         _side0.yl = 0;
         _side0.xr = 0;
         _side0.yr = 0;
         _side1.bin_size = (uint) (nNumOfLines1*nLineWidth1);
         _side1.bin_buf = buffer1;
         _side1.ImageWidth = nLineWidth1*8;
         _side1.ByteImageWidth = nLineWidth1;
         _side1.ActualScanNumber = nNumOfLines1;
         _side1.tone_buf = IntPtr.Zero;
         _side1.bin_width = 0;
         _side1.size = 0;
         _side1.tone_size = 0;
         _side1.g_p0.len = 0;
         _side1.g_p0.start = 0;
         _side1.g_p1.len = 0;
         _side1.g_p1.start = 0;
         _side1.g_p2.len = 0;
         _side1.g_p2.start = 0;
         _side1.flag = 0;
         _side1.ScanCounter = 0;
         _side1.OutFlag = 0;
         _side1.LineCount = 0;
         _side1.xl = 0;
         _side1.yl = 0;
         _side1.xr = 0;
         _side1.yr = 0;
         _pollResults.Clear();
         try
         {
             if (_isRunningNow)
             {
                 EndRecognition(0, 0, 0);
             }
             else
             {
                 _isRunningNow = true;
             }
             _bulletinNumber = -1;
             int res = StartRecognition(ref _side0, ref _side1);
             if (res < 0)
             {
                 SetError(ErrorCode.StartRecognitionFailed, "Не удалось начать распознавание: " + res);
                 throw new OcrException("Не удалось начать распознавание: " + res);
             }
             StartOnLineTesting(ref _side0, ref _side1, GetFrameDist_mm());
         }
         catch (Exception ex)
         {
             SetError(ErrorCode.UnexpectedError, "RunRecognize: " + ex);
             throw;
         }
     }
 }
Beispiel #2
0
 public unsafe void GetHalftoneBuffer( 
     ScannedSide side, short x, short y, short w, short h, MemoryBlock iMemory, out short id)
 {
     if (side == ScannedSide.Undefined)
         throw new ArgumentException("Сторона не определена");
     var sideIndex = (int)side;
     var ptr = _sh.HalftoneBuffer[sideIndex];
     if (side == ScannedSide.Top)
     {
         ptr = HalfToneBuffer0.ToPointer();
     }
     else if (side == ScannedSide.Bottom)
     {
         ptr = HalfToneBuffer1.ToPointer();
     }
     var sourceBuffer = (byte*)ptr.ToPointer();
     x -= _x[sideIndex];
     y -= _y[sideIndex];
     if (x < 0)
     {
         throw new Exception("недопустимое значение левой границы");
     }
     if (y < 0)
     {
         throw new Exception("недопустимое значение верхней границы");
     }
     if (h < 0)
     {
         throw new Exception("отрицательная высота");
     }
     if (w < 0)
     {
         throw new Exception("отрицательная ширина");
     }
     if (x + w > _currentConfiguration.DotsOneSide || y + h > _currentConfiguration.MaxLines)
     {
         throw new Exception("запрашиваемое изображение выходит за границы отсканированной области");
     }
     if (x % DOTS_PER_BYTE_HALFTONE != 0)
     {
         throw new Exception("начальная координата не попадает на границу байта!");
     }
     if (w % DOTS_PER_BYTE_HALFTONE != 0)
     {
         throw new Exception("ширина запрошенной области содерит не целое число байт!");
     }
     ptr = iMemory.ToPointer();
     if (ptr == IntPtr.Zero)
     {
         throw new Exception("нет буфера для записи изображения!");
     }
     var destination = (byte*)ptr.ToPointer();
     var lengthLine = _currentConfiguration.DotsOneSide / DOTS_PER_BYTE_HALFTONE;
     var lengthCopy = w / DOTS_PER_BYTE_HALFTONE;
     var shift = (side == 0 ? 0 : _currentConfiguration.DotsOneSide);
     if (x == y && y == 0 && lengthCopy == lengthLine)
     {
         if (!WhiteCoeffApplyed[sideIndex])
         {
             var wcPtr = _whiteCoeffU.ToPointer();
             if ((_currentConfiguration.Options & HardwareOptions.RightToLeftHalftone) > 0)
             {
                 if (!_halftoneFlipped[sideIndex])
                 {
                     FlipBufferVertically(sourceBuffer, lengthCopy, h);
                     _halftoneFlipped[sideIndex] = true;
                 }
                 applyWhiteCoeffs(sourceBuffer, destination, (byte*)wcPtr.ToPointer() + shift, lengthCopy, h);
             }
             else
             {
                 applyWhiteCoeffs(sourceBuffer, destination, (byte*)wcPtr.ToPointer() + shift, lengthCopy, h);
             }
         }
         else
         {
         }
     }
     else
     {
         int wcX = x;
         var wcInc = 1;
         if (!_halftoneFlipped[sideIndex] &&
             (_currentConfiguration.Options & HardwareOptions.RightToLeftHalftone) > 0)
         {
             wcX = x + w - 1;
             wcInc = -1;
             x = (short)(_currentConfiguration.DotsOneSide - x - w);
         }
         var startLine = sourceBuffer + // начало буфера
                         y * lengthLine + // число байт в первых y-строках
                         x / BaseSharedMemory.DotsPerByteHalftone; // число байт в первых x-точках
         var p = destination;
         for (var i = 0; i < h; i++)
         {
             var source = startLine;
             for (int j = 0, wcJ = wcX; j < lengthCopy; j++, wcJ += wcInc)
             {
                 *p++ = whiteCoeffTable.whiteCoeff[(*source++ << 8) + _whiteCoeff[shift + wcJ]];
             }
             startLine += lengthLine;
         }
         if (!_halftoneFlipped[sideIndex] &&
             (_currentConfiguration.Options & HardwareOptions.RightToLeftHalftone) > 0)
         {
             FlipBufferVertically(destination, w, h);
         }
     }
     id = 0;
 }