<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Need some help with gauss filter in Intel® Integrated Performance Primitives</title>
    <link>https://community.intel.com/t5/Intel-Integrated-Performance/Need-some-help-with-gauss-filter/m-p/813498#M4052</link>
    <description>I am using UIC to load a bitmap to be manipulated and then written out.&lt;DIV&gt;Code:&lt;/DIV&gt;&lt;DIV&gt;[cpp]using namespace UIC;

int loadBMP(const char* inFile, Ipp8u** memBuffer, Image&amp;amp; image,
	ImageColorSpec&amp;amp; colorSpec, ImageSamplingGeometry&amp;amp; geometry, 
	int&amp;amp; lineStep, int&amp;amp; pixelStep, int&amp;amp; numComponent)
{
	CStdFileInput fin;
	if(!BaseStream::IsOk(fin.Open(inFile)))
		return 1;

	ImageDataPtr dataPtr;
	ImageDataOrder dataOrder;
	BMPDecoder decoder;
	ExcStatus status;

	status = decoder.Init();
	if(ExcStatusOk != status)
	{
		return 1;
	}

	status = decoder.AttachStream(fin);
	if(ExcStatusOk != status)
	{
		return 1;
	}

	status = decoder.ReadHeader(colorSpec, geometry);
	if(ExcStatusOk != status)
	{
		return 1;
	}

	numComponent = geometry.NOfComponents();

	// set data type = 8 unsigned
	dataOrder.SetDataType(T8u);
	// set to interleaved data order
	dataOrder.ReAlloc(Interleaved, numComponent);
	// byte steps for pixel alignment i.e. for interleaved = 3 bytes for 1 byte per component RGB
	pixelStep = numComponent;
	dataOrder.PixelStep()[0] = numComponent;

	lineStep = geometry.RefGridRect().Width() * numComponent;

	// byte steps for img alignment
	dataOrder.LineStep()[0] = lineStep;

	image.ColorSpec().ReAlloc(numComponent);
	image.ColorSpec().SetColorSpecMethod(Enumerated);
	image.ColorSpec().SetComponentToColorMap(Direct);	// not using pallette

	for(int i = 0; i &amp;lt; numComponent; i++)
	{
		image.ColorSpec().DataRange()&lt;I&gt;.SetAsRange8u(255);
	}

	image.ColorSpec().SetEnumColorSpace(BGR);

	// alloc memory
	*memBuffer = (Ipp8u*)ippMalloc(dataOrder.LineStep()[0] * geometry.RefGridRect().Width());
	dataPtr.p8u = *memBuffer; 
	image.Buffer().Attach(&amp;amp;dataPtr, dataOrder, geometry);

	status = decoder.ReadData(image.Buffer().DataPtr(), dataOrder);
	if(ExcStatusOk != status)
	{
		return 1;
	}

	//decoder.DetachStream();
	
	return 0;
}

int writeBMP(const char* outFile, Image&amp;amp; image)
{
	// write out
	BMPEncoder bmpEncoder;
	CStdFileOutput fo;
	ExcStatus status;

	if(!BaseStream::IsOk(fo.Open(outFile)))
		return 1;

	status = bmpEncoder.Init();
	if(status != ExcStatusOk)
		return 1;

	status = bmpEncoder.AttachStream(fo);
	if(status != ExcStatusOk)
		return 1;

	status = bmpEncoder.AttachImage(image);
	if(status != ExcStatusOk)
		return 1;

	status = bmpEncoder.WriteHeader();
	if(status != ExcStatusOk)
		return 1;

	status = bmpEncoder.WriteData();
	if(status != ExcStatusOk)
		return 1;

	/*bmpEncoder.DetachImage();
	bmpEncoder.DetachStream();*/

	return 0;
}

IppStatus blur(Image&amp;amp; image, Ipp8u* mem, int lineStep, int width, int height)
{
	IppStatus status;
	IppiSize roi;
	roi.width = width;
	roi.height = height;

	// copy out the memory from image
	Ipp8u* work = (Ipp8u*)ippMalloc(width * height * 3);
	status = ippiCopy_8u_C3R(image.Buffer().DataPtr()-&amp;gt;p8u, lineStep, work, lineStep, roi);

	IppiSize extRoi;
	extRoi.width = width + 2;
	extRoi.height = height + 2;

	int extStep;
	Ipp8u* extWork = ippiMalloc_8u_C3(width + 2, height + 2, &amp;amp;extStep);
	Ipp8u* startPt = extWork + extStep + 3;

	// copy over from work to extWork
	status = ippiCopy_8u_C3R(work, lineStep, startPt, extStep, roi);
	status = ippiCopyReplicateBorder_8u_C3IR(startPt, extStep, roi, extRoi, 1, 1);

	status = ippiFilterGauss_8u_C3R(extWork, extStep, work, lineStep, roi, ippMskSize3x3);

	// copy work back in
	status = ippiCopy_8u_C3R(work, lineStep, image.Buffer().DataPtr()-&amp;gt;p8u, lineStep, roi);

	ippiFree(work);
	ippiFree(extWork);

	return status;
}

int main()
{
	char* inFileName = "c:\\test.bmp";
	char* outFileName = "c:\\test_out.bmp";

	Ipp8u* imgMemory = NULL;
	Image image;
	ImageSamplingGeometry geometry;
	ImageColorSpec colorSpec;
	int lineStep, pixelStep, numComponent;
	
	int status = loadBMP(inFileName, &amp;amp;imgMemory, image, colorSpec, geometry, lineStep, pixelStep, numComponent);
	if(status != 0)
	{
		return 1;
	}

	int w = geometry.RefGridRect().Width();
	int h = geometry.RefGridRect().Height();

	IppStatus stat = blur(image, imgMemory, lineStep, w, h);

	writeBMP(outFileName, image);

	ippiFree(imgMemory);

	return 0;
}
[/cpp] &lt;/I&gt;&lt;/DIV&gt;&lt;DIV&gt;Problems:&lt;/DIV&gt;&lt;DIV&gt;1. Program seems to randomly crash at ippiFilterGauss -Unhandled exception at 0x02cd53b0 in ipptest.exe: 0xC0000005: Access violation reading location 0x0108f6bd. Not sure what is causing this?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;2. When the program runs without crashing, the filtered output is slightly shifted diagonally to the lower right. This happens with:&lt;/DIV&gt;&lt;DIV&gt;[cpp]Ipp8u* startPt = extWork + extStep + 3;[/cpp] But no shifting problem with this:&lt;/DIV&gt;&lt;DIV&gt;[cpp]Ipp8u* startPt = extWork;[/cpp] I was under the impression based on the samples that I need to shift the start pointer by 1 pixel down and 1 pixel to the right to work correctly with the extended image: 1 line down (+ extStep), 1 pixel to the right (3 as RGB). Or did I get it wrong?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Edit: IPP v7, Windows7&lt;/DIV&gt;</description>
    <pubDate>Mon, 28 May 2012 09:23:09 GMT</pubDate>
    <dc:creator>cks2k2</dc:creator>
    <dc:date>2012-05-28T09:23:09Z</dc:date>
    <item>
      <title>Need some help with gauss filter</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Need-some-help-with-gauss-filter/m-p/813498#M4052</link>
      <description>I am using UIC to load a bitmap to be manipulated and then written out.&lt;DIV&gt;Code:&lt;/DIV&gt;&lt;DIV&gt;[cpp]using namespace UIC;

int loadBMP(const char* inFile, Ipp8u** memBuffer, Image&amp;amp; image,
	ImageColorSpec&amp;amp; colorSpec, ImageSamplingGeometry&amp;amp; geometry, 
	int&amp;amp; lineStep, int&amp;amp; pixelStep, int&amp;amp; numComponent)
{
	CStdFileInput fin;
	if(!BaseStream::IsOk(fin.Open(inFile)))
		return 1;

	ImageDataPtr dataPtr;
	ImageDataOrder dataOrder;
	BMPDecoder decoder;
	ExcStatus status;

	status = decoder.Init();
	if(ExcStatusOk != status)
	{
		return 1;
	}

	status = decoder.AttachStream(fin);
	if(ExcStatusOk != status)
	{
		return 1;
	}

	status = decoder.ReadHeader(colorSpec, geometry);
	if(ExcStatusOk != status)
	{
		return 1;
	}

	numComponent = geometry.NOfComponents();

	// set data type = 8 unsigned
	dataOrder.SetDataType(T8u);
	// set to interleaved data order
	dataOrder.ReAlloc(Interleaved, numComponent);
	// byte steps for pixel alignment i.e. for interleaved = 3 bytes for 1 byte per component RGB
	pixelStep = numComponent;
	dataOrder.PixelStep()[0] = numComponent;

	lineStep = geometry.RefGridRect().Width() * numComponent;

	// byte steps for img alignment
	dataOrder.LineStep()[0] = lineStep;

	image.ColorSpec().ReAlloc(numComponent);
	image.ColorSpec().SetColorSpecMethod(Enumerated);
	image.ColorSpec().SetComponentToColorMap(Direct);	// not using pallette

	for(int i = 0; i &amp;lt; numComponent; i++)
	{
		image.ColorSpec().DataRange()&lt;I&gt;.SetAsRange8u(255);
	}

	image.ColorSpec().SetEnumColorSpace(BGR);

	// alloc memory
	*memBuffer = (Ipp8u*)ippMalloc(dataOrder.LineStep()[0] * geometry.RefGridRect().Width());
	dataPtr.p8u = *memBuffer; 
	image.Buffer().Attach(&amp;amp;dataPtr, dataOrder, geometry);

	status = decoder.ReadData(image.Buffer().DataPtr(), dataOrder);
	if(ExcStatusOk != status)
	{
		return 1;
	}

	//decoder.DetachStream();
	
	return 0;
}

int writeBMP(const char* outFile, Image&amp;amp; image)
{
	// write out
	BMPEncoder bmpEncoder;
	CStdFileOutput fo;
	ExcStatus status;

	if(!BaseStream::IsOk(fo.Open(outFile)))
		return 1;

	status = bmpEncoder.Init();
	if(status != ExcStatusOk)
		return 1;

	status = bmpEncoder.AttachStream(fo);
	if(status != ExcStatusOk)
		return 1;

	status = bmpEncoder.AttachImage(image);
	if(status != ExcStatusOk)
		return 1;

	status = bmpEncoder.WriteHeader();
	if(status != ExcStatusOk)
		return 1;

	status = bmpEncoder.WriteData();
	if(status != ExcStatusOk)
		return 1;

	/*bmpEncoder.DetachImage();
	bmpEncoder.DetachStream();*/

	return 0;
}

IppStatus blur(Image&amp;amp; image, Ipp8u* mem, int lineStep, int width, int height)
{
	IppStatus status;
	IppiSize roi;
	roi.width = width;
	roi.height = height;

	// copy out the memory from image
	Ipp8u* work = (Ipp8u*)ippMalloc(width * height * 3);
	status = ippiCopy_8u_C3R(image.Buffer().DataPtr()-&amp;gt;p8u, lineStep, work, lineStep, roi);

	IppiSize extRoi;
	extRoi.width = width + 2;
	extRoi.height = height + 2;

	int extStep;
	Ipp8u* extWork = ippiMalloc_8u_C3(width + 2, height + 2, &amp;amp;extStep);
	Ipp8u* startPt = extWork + extStep + 3;

	// copy over from work to extWork
	status = ippiCopy_8u_C3R(work, lineStep, startPt, extStep, roi);
	status = ippiCopyReplicateBorder_8u_C3IR(startPt, extStep, roi, extRoi, 1, 1);

	status = ippiFilterGauss_8u_C3R(extWork, extStep, work, lineStep, roi, ippMskSize3x3);

	// copy work back in
	status = ippiCopy_8u_C3R(work, lineStep, image.Buffer().DataPtr()-&amp;gt;p8u, lineStep, roi);

	ippiFree(work);
	ippiFree(extWork);

	return status;
}

int main()
{
	char* inFileName = "c:\\test.bmp";
	char* outFileName = "c:\\test_out.bmp";

	Ipp8u* imgMemory = NULL;
	Image image;
	ImageSamplingGeometry geometry;
	ImageColorSpec colorSpec;
	int lineStep, pixelStep, numComponent;
	
	int status = loadBMP(inFileName, &amp;amp;imgMemory, image, colorSpec, geometry, lineStep, pixelStep, numComponent);
	if(status != 0)
	{
		return 1;
	}

	int w = geometry.RefGridRect().Width();
	int h = geometry.RefGridRect().Height();

	IppStatus stat = blur(image, imgMemory, lineStep, w, h);

	writeBMP(outFileName, image);

	ippiFree(imgMemory);

	return 0;
}
[/cpp] &lt;/I&gt;&lt;/DIV&gt;&lt;DIV&gt;Problems:&lt;/DIV&gt;&lt;DIV&gt;1. Program seems to randomly crash at ippiFilterGauss -Unhandled exception at 0x02cd53b0 in ipptest.exe: 0xC0000005: Access violation reading location 0x0108f6bd. Not sure what is causing this?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;2. When the program runs without crashing, the filtered output is slightly shifted diagonally to the lower right. This happens with:&lt;/DIV&gt;&lt;DIV&gt;[cpp]Ipp8u* startPt = extWork + extStep + 3;[/cpp] But no shifting problem with this:&lt;/DIV&gt;&lt;DIV&gt;[cpp]Ipp8u* startPt = extWork;[/cpp] I was under the impression based on the samples that I need to shift the start pointer by 1 pixel down and 1 pixel to the right to work correctly with the extended image: 1 line down (+ extStep), 1 pixel to the right (3 as RGB). Or did I get it wrong?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Edit: IPP v7, Windows7&lt;/DIV&gt;</description>
      <pubDate>Mon, 28 May 2012 09:23:09 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Need-some-help-with-gauss-filter/m-p/813498#M4052</guid>
      <dc:creator>cks2k2</dc:creator>
      <dc:date>2012-05-28T09:23:09Z</dc:date>
    </item>
    <item>
      <title>Need some help with gauss filter</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Need-some-help-with-gauss-filter/m-p/813499#M4053</link>
      <description>Hi, &lt;BR /&gt;&lt;BR /&gt;By quickly checking the code, for 3x3 kernal, shoud it shift 1 column and 1 row? like the following:&lt;BR /&gt;Ipp8u* startPt = extWork + extStep + 1&lt;BR /&gt;&lt;BR /&gt;Thanks,&lt;BR /&gt;Chao</description>
      <pubDate>Fri, 01 Jun 2012 03:46:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Need-some-help-with-gauss-filter/m-p/813499#M4053</guid>
      <dc:creator>Chao_Y_Intel</dc:creator>
      <dc:date>2012-06-01T03:46:00Z</dc:date>
    </item>
  </channel>
</rss>

