16位图像在EMGU.CV中崩溃Image.ThresholdBinary

时间:2014-11-10 20:38:05

标签: c# image-processing emgucv

我在下面有这个应用程序的两个版本。这个,以及我用8位图像编写的重写。 8位图像工作正常。 16位图像导致Image.Threshold在本机OpenCV调用阈值中崩溃,返回唯一错误:

Emgu.CV.dll中出现'Emgu.CV.Util.CvException'类型的第一次机会异常 其他信息:OpenCV:

下面导致我的“手动编码”16位图像崩溃,它也会在16位TIF图像上崩溃,通过

加载
var img = new Image<Gray,UInt16>("test.tif");

崩溃完全相同,错误信息相同。

这是我的应用程序:

思想?

using System;
using System.Runtime.InteropServices;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.UI;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace MyUnitTest
{
    [TestClass]
    public class UnitTestOpenCV
    {
        // Set up an image with a solid rectangle in it.
        private IntPtr _smallImg;
        private const int Ncols = 500;
        private const int Nrows = 100;

        [TestInitialize]
        public void Init()
        {
            const int n = Ncols * Nrows;
            var pixels = new short[n];
            _smallImg = Marshal.AllocHGlobal(n * 2);
            Marshal.Copy(pixels, 0, _smallImg, pixels.Length);
            for (int col = 75; col < 75 + 200; col++)
            {
                for (int row = 25; row < 25 + 50; row++)
                {
                    Marshal.WriteInt16(_smallImg, 2 * (row * Ncols + col), 10000);
                }
            }
        }

        [TestCleanup]
        public void Cleanup()
        {
            Marshal.FreeHGlobal(_smallImg);
        }

        [TestMethod]
        public void FindingMinBoundingRectangle()
        {
            var img = new Image<Gray, ushort>(Ncols, Nrows, Ncols, _smallImg);
            var rotatedImg = img.Rotate(20, new Gray(0), false);
            var bwImg      = img.ThresholdBinary(new Gray(5000), new Gray(255));
            var contour    = bwImg.FindContours();
            var rect = contour.GetMinAreaRect();
            rotatedImg.Draw(rect, new Gray(30000), 50);
            rotatedImg.Save("img.tif");
            AOIAlgorithmsBase.SaveImage("myImg.tif", img.MIplImage.imageData, Ncols, Nrows, Ncols);
            ImageViewer.Show(rotatedImg, "Image Viewer Window");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

实际上,即使EmguCV读取16位图像,大多数处理程序也需要8位或32位图像。从OpenCV docs获取阈值方法:

  

参数:
  src - 输入数组(单通道,8位或32位浮点)。

在我的情况下,将我的图像转换为8位用于所有Emgu处理和显示,然后我转换回16位以便以tif格式保存。