<?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[OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren]]></title><description><![CDATA[<p>Nabend!</p>
<p>Ich habe hier ein kleines Problem, das mich langsam in den Wahnsinn treibt.</p>
<p>Ziel ist es ein Bild in Programm A (Sender) zu laden und dann via &quot;Shared Memory&quot; in Programm B (Receiver) in Empfang zu nehmen und wieder auszugeben.</p>
<p>Da die OpenCV-Fkt. &quot;cvLoadImage&quot; nur einen Pointer auf das im Speicher liegende Bild zurück gibt und ich auf den gemeinsamen Speicherbereich auch nur via Pointer zugreifen kann, ist mein Plan das Bild mittels &quot;memcpy&quot; in den gemeinsamen Speicherbereich zu heben.</p>
<p>Das funktioniert leider Alles nicht so ganz...</p>
<p>Grundsätzlich habe ich erstmal keinen Plan, wie ich die tatsächliche Größe des durch das Bild belegten Speicherbereiches bestimmen kann.<br />
Das ist ja ziemlich essentiell, da ich a) die Größe für die Reservierung des &quot;SharedMemory&quot; angeben muss und b) für &quot;memcpy&quot; diese Information auch zwingend benötige.</p>
<p>Bei einem RGB-Bild mit einer Auflösung von 225x225 Pixel und 8Bit Farbtiefe sollte das theoretisch sein:<br />
3 x 255 x 255 x 1Byte = 151875 Byte</p>
<p>Kann ich das nicht auch irgendwie zur Laufzeit des Programmes bestimmen lassen?</p>
<p>Danke für Eure Hilfe!</p>
<p>MfG<br />
Aves</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301831/opencv-amp-shared-memory-bildmatrix-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 08:29:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301831.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Apr 2012 15:50:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Wed, 04 Apr 2012 15:50:16 GMT]]></title><description><![CDATA[<p>Nabend!</p>
<p>Ich habe hier ein kleines Problem, das mich langsam in den Wahnsinn treibt.</p>
<p>Ziel ist es ein Bild in Programm A (Sender) zu laden und dann via &quot;Shared Memory&quot; in Programm B (Receiver) in Empfang zu nehmen und wieder auszugeben.</p>
<p>Da die OpenCV-Fkt. &quot;cvLoadImage&quot; nur einen Pointer auf das im Speicher liegende Bild zurück gibt und ich auf den gemeinsamen Speicherbereich auch nur via Pointer zugreifen kann, ist mein Plan das Bild mittels &quot;memcpy&quot; in den gemeinsamen Speicherbereich zu heben.</p>
<p>Das funktioniert leider Alles nicht so ganz...</p>
<p>Grundsätzlich habe ich erstmal keinen Plan, wie ich die tatsächliche Größe des durch das Bild belegten Speicherbereiches bestimmen kann.<br />
Das ist ja ziemlich essentiell, da ich a) die Größe für die Reservierung des &quot;SharedMemory&quot; angeben muss und b) für &quot;memcpy&quot; diese Information auch zwingend benötige.</p>
<p>Bei einem RGB-Bild mit einer Auflösung von 225x225 Pixel und 8Bit Farbtiefe sollte das theoretisch sein:<br />
3 x 255 x 255 x 1Byte = 151875 Byte</p>
<p>Kann ich das nicht auch irgendwie zur Laufzeit des Programmes bestimmen lassen?</p>
<p>Danke für Eure Hilfe!</p>
<p>MfG<br />
Aves</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198743</guid><dc:creator><![CDATA[aves_aquila]]></dc:creator><pubDate>Wed, 04 Apr 2012 15:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Wed, 04 Apr 2012 18:36:24 GMT]]></title><description><![CDATA[<p>Deine Rechnung ist richtig wenn die Daten der cv::Mat kontinuierlich im Speicher liegen. Für's Alignment kanns aber schonmal sein, dass du am Ende jeder der Zeilen etwas Padding hast.</p>
<pre><code class="language-cpp">int width = 225;
int height = 225;
cv::Mat img( height, width, CV_8UC3 );
size_t memSize = img.dataend - img.datastar;
if ( img.isContinuous() )
    ASSERT( memSize == height*width*3 );
</code></pre>
<p>Das Beispiel benutzt das C++-Interface, dass es ab OpenCV2 gibt. Dein cvLoadImage kommt allerdings aus dem weniger komfortablen alten C-Interface. Wenn du die Chance hast, das neue zu benutzen, kann ich das nur empfehlen. <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>Wenn du dann in deinem Empfänger deinen shared-Bildspeicher schon hast und ihn wieder in eine cv::Mat bekommen willst, kannst du das übrigens mit den entsprechenden Konstruktoren machen, die nicht selbst allokieren, sondern nen Zeiger nehmen:</p>
<pre><code class="language-cpp">C++: Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
C++: Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
C++: Mat::Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0)
</code></pre>
<p>Siehe hier: <a href="http://opencv.itseez.com/modules/core/doc/basic_structures.html#mat-mat" rel="nofollow">http://opencv.itseez.com/modules/core/doc/basic_structures.html#mat-mat</a><br />
Aber vielleicht fällt dir ja noch was eleganteres ein, als den nackeligen Speicher rüberzuschieben und den Rest dann rekonstruieren zu müssen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2198820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2198820</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Wed, 04 Apr 2012 18:36:24 GMT</pubDate></item><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Thu, 05 Apr 2012 13:34:18 GMT]]></title><description><![CDATA[<p>Danke für Tipps!</p>
<p>Konnte damit ein paar Anpassungen vornehmen. Leider stürzt mein Sender leider mit einem Speicherzugriffsfehler ab, sobald das geladene Bild in den &quot;SharedMemory&quot; kopiert werden soll.<br />
Ich raffe es nicht, wo der Fehler liegt... Hab das Bild jetzt schwer verkleinert: RGB 128x128 Px.<br />
Wenn ich das richtig verstehe, kann ein SharedMemory Element max. 128 kByte groß werden, oder wie sehe ich das? <em>Vergl. SHHMAX:</em> [url]<a href="http://openbook.galileocomputing.de/linux_unix_programmierung/Kap09-006.htm#Xxx999240" rel="nofollow">http://openbook.galileocomputing.de/linux_unix_programmierung/Kap09-006.htm#Xxx999240</a> [/url]<br />
Das Bild das ich nutze, ist aber wesentlich kleiner mit seinen 48 kByte.</p>
<p>Wenn die Profis mal drüberschauen könnten? Bis Zeile 49 läuft es. Dann steigt das Programm mit einem Speicherzugriffsfehler aus.</p>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;cv.h&gt;
#include &lt;highgui.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/ipc.h&gt;
#include &lt;sys/shm.h&gt;
#include &lt;iostream&gt;
#include &lt;unistd.h&gt;

using namespace cv;
using namespace std;

int main()
{
	Mat image;
	Mat *p_img0;
	int *sema;
	int shmid0;
	int shmid1;
	key_t key0;
	key_t key1;
	size_t memSize;

	//Name der Shared Memory Segmente
	key0 = 7887;
	key1 = 8998;

	image = imread(&quot;lenna.png&quot;);
	if(!image.data){
		cout &lt;&lt; &quot;Fehler beim Laden des Bildes!&quot; &lt;&lt; endl;
		}
	cout &lt;&lt; &quot;size: &quot; &lt;&lt; image.size().height &lt;&lt; &quot; , &quot; &lt;&lt; image.size().width &lt;&lt; endl;
	memSize = image.dataend - image.datastart;
	cout &lt;&lt; &quot;memSize: &quot; &lt;&lt; memSize &lt;&lt; endl;

	//Shared Memory Segmente anlegen
	shmid0 = shmget(key0, memSize, IPC_CREAT | 0666);
	if(shmid0 &lt; 0){
		cout &lt;&lt; &quot;Anlegen des Speicherbereiches gescheitert!&quot; &lt;&lt; endl;
	}
	shmid1 = shmget(key1, 10, IPC_CREAT | 0666);

	//Segmente an lokale Ressourcen hängen
	p_img0 = (Mat*)shmat(shmid0, NULL, 0);
	cout &lt;&lt; &quot;Pointer auf SHM :&quot; &lt;&lt; p_img0 &lt;&lt; endl;
	sema = (int*)shmat(shmid1, NULL, 0);

	image.copyTo(*p_img0);
	*sema = 12345;
	cout &lt;&lt; &quot;*sema :&quot; &lt;&lt; *sema &lt;&lt; endl;

	namedWindow(&quot;Sender&quot;);
	imshow(&quot;Sender&quot;, *p_img0);

	waitKey(0);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2199043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199043</guid><dc:creator><![CDATA[aves_aquila]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:34:18 GMT</pubDate></item><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Thu, 05 Apr 2012 13:46:40 GMT]]></title><description><![CDATA[<p>Update:</p>
<p><strong>$ cat /proc/sys/kernel/shmmax</strong> ergab 32 MByte<br />
/proc/sys/kernel/shmin exisitiert nicht.</p>
<p>Da vermute ich mal, das es dann wohl keine Untergrenze gibt. Die Grenzen eines SharedMemory Bereiches auf meinem System sollten also nicht das Problem sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199053</guid><dc:creator><![CDATA[aves_aquila]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Thu, 05 Apr 2012 13:59:44 GMT]]></title><description><![CDATA[<p>Seh ich das richtig, dass du so tust, als wäre eine Instanz der Klasse cv::Mat nichts anderes als der Bildspeicher, den sie benutzt? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2199065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199065</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Thu, 05 Apr 2012 13:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Thu, 05 Apr 2012 14:05:34 GMT]]></title><description><![CDATA[<p>Ach Mist...</p>
<p>Alles klar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199073</guid><dc:creator><![CDATA[aves_aquila]]></dc:creator><pubDate>Thu, 05 Apr 2012 14:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Thu, 05 Apr 2012 14:11:45 GMT]]></title><description><![CDATA[<p>Ähm, sehe ich das richtig, das ich jetzt für jedes Element der Klasse die ich benutze, einen eigenen SharedMemory Bereich anlege, jedes Element in einen Speicherbereich kopiere.<br />
Um dann am Ziel das wieder aus den einzelnen Bereichen den entsprechenden Elementen des Objektes wieder zuzuordnen?</p>
<p>Das aber hässlich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2199078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199078</guid><dc:creator><![CDATA[aves_aquila]]></dc:creator><pubDate>Thu, 05 Apr 2012 14:11:45 GMT</pubDate></item><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Thu, 05 Apr 2012 14:25:08 GMT]]></title><description><![CDATA[<p>Ja, das wär allerdings hässlich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Ich würde zusätzlich zum Bildspeicher nur die Informationen an das andere Programm übergeben, die es braucht. Wenn es bei dir nur um Bilder geht, sollten das Höhe, Breite, Linestep, und eventuell Anzahl der Kanäle und bits pro Kanal sein, jenachdem wie allgemeingültig du es machen willst.<br />
Die cv::Mat mit placement new direkt in der shared memory zu konstruieren könnte gefährlich werden, weil das (nicht nur wegen Alignment) eventuell scheppert. Ob du das mit POD so hinbekommst, dass es UB ist, weiß ich nicht. Da du ja deine Zielanwendung vermutlich eh irgendwie den namen des shared memory segments mitteilst und was es damit tun soll, kannst du auf dem Weg ja auch die oben genannten Infos mit übermitteln.</p>
<p>Edit: In der Zielanwendung käm dann übrigens einer der Konstruktoren, die ich im ersten Post erwähnte, dran. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2199087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2199087</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Thu, 05 Apr 2012 14:25:08 GMT</pubDate></item><item><title><![CDATA[Reply to OpenCV &amp;amp; Shared Memory - Bildmatrix kopieren on Wed, 18 Apr 2012 18:54:47 GMT]]></title><description><![CDATA[<p>Danke nochmal für deine Hilfe!</p>
<p>Habe es hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2203401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2203401</guid><dc:creator><![CDATA[aves_aquila]]></dc:creator><pubDate>Wed, 18 Apr 2012 18:54:47 GMT</pubDate></item></channel></rss>