<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Frage: memory Management: Wrapper um IplImage(ansi C), OpenGL Texture, D3d8Texture, ARImage]]></title><description><![CDATA[<p>Hallöchen.<br />
Folgendes Problemchen stellt sich mir:<br />
Ich habe 4 Bibliotheken die mit Bilddaten arbeiten und die ich gerne mit einem Wrapper über Bilddaten bedient hätte.<br />
Mir ist aber noch schleierhaft wie ich das gescheit bewerkstelligen soll.<br />
Folgende Punkte sind zu beachten:</p>
<ul>
<li>Den Formaten ist soweit ich bisher gekommen bin gemein, dass sie in unsigned char (8bit pro Kanal) speichern.</li>
<li>IplImage (aus OpenCV) speichert in unsigned char und vertauschten blau und Rot Kanälen: BGR</li>
<li>ausserdem allokiert es speicher mit malloc</li>
<li>Möchte die Bilddaten aber gerne über einen boost::shared_ptr/array managen.</li>
<li>IplImage wird wohl am meisten benutzt werden, also speichere ich intern in 8bit BGR</li>
<li>Die verwendung von IplImage soll einfach sein. OpenCV arbeitet mit IplImage* d.h. es wird ständig ein dumb-ptr auf das ding rumgeschickt.</li>
<li>zugriffe auf IplImage können lesend und schreibend sein.</li>
</ul>
<p>So schauts bisher aus:</p>
<pre><code class="language-cpp">class ARGImage
{

public:
	enum ByteOrder {ARG_RGB, ARG_BGR};

	// Constructors:
	ARGImage(void);
	ARGImage(ARGImage&amp; image);
	ARGImage(const unsigned char * data, unsigned int width, unsigned int height, ByteOrder order=ARG_RGB);
	virtual ~ARGImage(void);

	point2i size() {return size_;};
	IplImage* asIpl();
	boost::shared_array&lt;unsigned char&gt; asUCBGR();
	boost::shared_array&lt;unsigned char&gt; asUCRGB();

private:
	boost::shared_array&lt;ClrComponent&gt; pData_;
	point2i size_;
	IplImage* piplHeader_;

};
/// in der CPP:
ARGImage::ARGImage(const unsigned char * pData, unsigned int width, unsigned int height, ByteOrder order):
	pData_(new ClrComponent[width*height*sizeof(ClrComponent)])
{
	IplImage* pIpl;
	CvMat* pMat;

	if (pData_)
	{
		// just to be sure:
		assert(sizeof(ClrComponent) == sizeof(unsigned char));
		try
		{
			pMat = cvCreateMatHeader(height,width, CV_8UC3);
			cvSetData(pMat, (void*)pData, 3);
			pIpl = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U,3);
			cvSetData(pIpl, pData_.get(), 3);
			if (order==ARG_RGB)
			{
				cvCvtColor(pMat, pIpl, CV_RGB2BGR);
			}
			else
			{
				cvCopy(pMat, pIpl);
			}

		}
		catch(...)
		{
			std::cout &lt;&lt; &quot;ERROR: Exception occurred while trying to copy image data!&quot; &lt;&lt; std::endl;
			throw;
		}

		// reorder b and r channels if necessary:
	}
}
</code></pre>
<p>Ich habe es auch geschafft dem OpenCV über<br />
cvCreateImageHeader per new allokierte und in einem boost::shared_ptr gemanagte Daten unterzuschieben.</p>
<p>Hier also meine Frage: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /><br />
Mach ich hier grob was falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246619/frage-memory-management-wrapper-um-iplimage-ansi-c-opengl-texture-d3d8texture-arimage</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 01:42:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246619.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Jul 2009 13:17:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage: memory Management: Wrapper um IplImage(ansi C), OpenGL Texture, D3d8Texture, ARImage on Thu, 30 Jul 2009 13:17:34 GMT]]></title><description><![CDATA[<p>Hallöchen.<br />
Folgendes Problemchen stellt sich mir:<br />
Ich habe 4 Bibliotheken die mit Bilddaten arbeiten und die ich gerne mit einem Wrapper über Bilddaten bedient hätte.<br />
Mir ist aber noch schleierhaft wie ich das gescheit bewerkstelligen soll.<br />
Folgende Punkte sind zu beachten:</p>
<ul>
<li>Den Formaten ist soweit ich bisher gekommen bin gemein, dass sie in unsigned char (8bit pro Kanal) speichern.</li>
<li>IplImage (aus OpenCV) speichert in unsigned char und vertauschten blau und Rot Kanälen: BGR</li>
<li>ausserdem allokiert es speicher mit malloc</li>
<li>Möchte die Bilddaten aber gerne über einen boost::shared_ptr/array managen.</li>
<li>IplImage wird wohl am meisten benutzt werden, also speichere ich intern in 8bit BGR</li>
<li>Die verwendung von IplImage soll einfach sein. OpenCV arbeitet mit IplImage* d.h. es wird ständig ein dumb-ptr auf das ding rumgeschickt.</li>
<li>zugriffe auf IplImage können lesend und schreibend sein.</li>
</ul>
<p>So schauts bisher aus:</p>
<pre><code class="language-cpp">class ARGImage
{

public:
	enum ByteOrder {ARG_RGB, ARG_BGR};

	// Constructors:
	ARGImage(void);
	ARGImage(ARGImage&amp; image);
	ARGImage(const unsigned char * data, unsigned int width, unsigned int height, ByteOrder order=ARG_RGB);
	virtual ~ARGImage(void);

	point2i size() {return size_;};
	IplImage* asIpl();
	boost::shared_array&lt;unsigned char&gt; asUCBGR();
	boost::shared_array&lt;unsigned char&gt; asUCRGB();

private:
	boost::shared_array&lt;ClrComponent&gt; pData_;
	point2i size_;
	IplImage* piplHeader_;

};
/// in der CPP:
ARGImage::ARGImage(const unsigned char * pData, unsigned int width, unsigned int height, ByteOrder order):
	pData_(new ClrComponent[width*height*sizeof(ClrComponent)])
{
	IplImage* pIpl;
	CvMat* pMat;

	if (pData_)
	{
		// just to be sure:
		assert(sizeof(ClrComponent) == sizeof(unsigned char));
		try
		{
			pMat = cvCreateMatHeader(height,width, CV_8UC3);
			cvSetData(pMat, (void*)pData, 3);
			pIpl = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U,3);
			cvSetData(pIpl, pData_.get(), 3);
			if (order==ARG_RGB)
			{
				cvCvtColor(pMat, pIpl, CV_RGB2BGR);
			}
			else
			{
				cvCopy(pMat, pIpl);
			}

		}
		catch(...)
		{
			std::cout &lt;&lt; &quot;ERROR: Exception occurred while trying to copy image data!&quot; &lt;&lt; std::endl;
			throw;
		}

		// reorder b and r channels if necessary:
	}
}
</code></pre>
<p>Ich habe es auch geschafft dem OpenCV über<br />
cvCreateImageHeader per new allokierte und in einem boost::shared_ptr gemanagte Daten unterzuschieben.</p>
<p>Hier also meine Frage: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /><br />
Mach ich hier grob was falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752363</guid><dc:creator><![CDATA[krxlprnft]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:17:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage: memory Management: Wrapper um IplImage(ansi C), OpenGL Texture, D3d8Texture, ARImage on Thu, 30 Jul 2009 14:49:05 GMT]]></title><description><![CDATA[<p>krxlprnft schrieb:</p>
<blockquote>
<p>Mach ich hier grob was falsch?</p>
</blockquote>
<p>Schwer zu sagen. Was genau ist denn eigentlich das Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752440</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Thu, 30 Jul 2009 14:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage: memory Management: Wrapper um IplImage(ansi C), OpenGL Texture, D3d8Texture, ARImage on Thu, 30 Jul 2009 15:14:19 GMT]]></title><description><![CDATA[<p>Nunja, ich möcht mich möglichst an standards halten. Wenn jetzt einer die Klasse benutzt solls so Barrierefrei wie möglich sein.<br />
Seitdem ich aber Scott Meyer gelesen hab, hab ich Angst, dass das<br />
dem Nächsten gleich um die Rübe fliegt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Das Problem liegt darin, dass ich ständig dumme Pointer rausliefern muss,<br />
und darauf hoffen muss, dass keiner damit Mist baut.</p>
<p>z.B. könnte sich einer das IplImage geben lassen,<br />
und es gewissenhaft freigeben:</p>
<pre><code class="language-cpp">IplImage* ipl = argImage.asIpl();

...

cvReleaseImageHeader(ipl); // ok
cvReleaseImage(ipl);  // crash boom bang!!!! von mir intern gemanagter speicher wird freigegeben
</code></pre>
<p>z.B. kann ich einer OpenCV funktion (uchar*) ja keinen shared_ptr&lt;uchar&gt; reinschmeissen. Denn so schlau sind die smarten pointer dann auch nicht,<br />
dass sie sich nahtlos einfügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752468</guid><dc:creator><![CDATA[krxlprnft]]></dc:creator><pubDate>Thu, 30 Jul 2009 15:14:19 GMT</pubDate></item></channel></rss>