<?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[Wert von C++ nach Matlab übergeben]]></title><description><![CDATA[<p>Hallo,<br />
ich habe in Dev-C++ ein Programm geschrieben, was eine Schleife beinhaltet in welcher ein Wert ausgegeben wird. Zweck des Programms ist folgender: eine schwarze Kugel verfährt auf der x-Achse des Bildes. Die Position des Kugelmittelpunktes soll von dem Programm ausgegeben werden.<br />
Dieses Programm stürzt leider nach wenigen Sekunden ab.<br />
Nun meine zwei Fragen;<br />
warum stürzt mein Programm ab?<br />
Und wie kann ich den Wert in Matlab abrufen?<br />
Die Kugelpositon kann sich ständig ändern, weshalb sich auch der Ausgabewert des Programmes ändert. Matlab muss ständigen Zugriff auf diesen Wert haben. Eine Verzögerung größer als 0,2 Sekunden wäre zu viel.</p>
<p>Ich hoffe jemand kann mir helfen.<br />
Danke!</p>
<pre><code>#ifdef _CH_
#pragma package &lt;opencv&gt;
#endif

#ifndef _EiC
#include &quot;cv.h&quot;
#include &quot;highgui.h&quot;
#include &lt;stdio.h&gt;
#include &lt;ctype.h&gt;
#endif

int main()
{
    char Vid[] = &quot;WebCam&quot;;

    IplImage * frm; // erstellt objekt &quot;frm&quot;
    IplImage * cimg;
    IplImage * cimg2;
    CvCapture * capture; // erstellt objekt &quot;capture&quot;
    int x=640;
    int y=1;
    capture = cvCaptureFromCAM(0); // capture liest ein Bild von der Kamera ein
    CvScalar sl1;
    CvScalar sl2;
    CvScalar sr1;
    CvScalar sr2;

    if(!cvGrabFrame(capture))      // can't capture a frame 
        {              
        printf(&quot;Could not grab a frame\n\7&quot;);
        exit(0);
        }
 if( capture ) 
        {
        cvNamedWindow (Vid); //erstellt fenster &quot;vid&quot;

        do 
           {
            frm = cvQueryFrame( capture );
            cimg = cvRetrieveFrame(capture);           // retrieve the captured frame
            cvSetImageROI (cimg, cvRect(0, 220, x, y)); //Region of interest wird definiert um später in frmbw2 kopiert zu werden
            IplImage* frmbw2=cvCreateImage(cvSize(x,y),IPL_DEPTH_8U,1); //erstellt &quot;frmbw&quot; mit 640x1pixeln und 8 bit sw
            cvCvtColor(cimg,frmbw2,CV_BGR2GRAY); // frm -&gt; frmbw (ROI von cimg wird in frmbw2 kopiert und in schwarz weiß gewandelt
            cvResetImageROI(cimg);
            cvSmooth(frmbw2, frmbw2, CV_GAUSSIAN, 5, 5 ); // glättet frmbw mit gauss filter

            for (int i = 0; i&lt;(x-14);i++)
                {
                sl1=cvGet2D(frmbw2,0,i); // grauwert des iten pixels wird ausgelesen
                sl2=cvGet2D(frmbw2,0,i+3); //grauwert des iten+3 pixels wird ausgelesen
                double sl1d = sl1.val[0];
                double sl2d= sl2.val[0];
                double diff =(sl1d-sl2d); // differenz aus beiden grauwerten

                if (diff&gt;20)              //wenn die differenz zwischen den beiden pixeln groß genug ist (vermutlich linke kante der kugel)
                   {
                   sr1=cvGet2D(frmbw2,0,i+11); //gleiches prozedere für die rechte kante der kugel
                   sr2=cvGet2D(frmbw2,0,i+14);
                   double sr1d = sr1.val[0];
                   double sr2d= sr2.val[0];
                   double diff2=sr2d-sr1d;
                   int i2=i+7;
                   if (diff2&gt;20)
                      {
/*!!!!!!!!!!!!!!*/    [b]printf(&quot;kugelmittelpunkt wohl bei =%i\n&quot;,i2);//dieser Wert muss nach Matlab[/b]
                      }
                   }
                }
            printf (&quot;n&quot;);//um zu signalisieren, dass ein neues bild eingelesen wird
                                          if( frm )                                
                                            cvShowImage (Vid, frmbw2);

                                           int k = cvWaitKey( 1 );
                                                if (k == 27 || k == '\r') // Press ESC and Enter 
                                                break;                     // for out
            } while( frm );
            {cvDestroyWindow( Vid ); // Destroy the window
            cvReleaseCapture( &amp;capture );
        }
        } else
             puts( &quot;Can not Open the Webcam&quot; );
             return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/249523/wert-von-c-nach-matlab-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 14:31:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249523.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Sep 2009 16:23:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Tue, 08 Sep 2009 16:23:03 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe in Dev-C++ ein Programm geschrieben, was eine Schleife beinhaltet in welcher ein Wert ausgegeben wird. Zweck des Programms ist folgender: eine schwarze Kugel verfährt auf der x-Achse des Bildes. Die Position des Kugelmittelpunktes soll von dem Programm ausgegeben werden.<br />
Dieses Programm stürzt leider nach wenigen Sekunden ab.<br />
Nun meine zwei Fragen;<br />
warum stürzt mein Programm ab?<br />
Und wie kann ich den Wert in Matlab abrufen?<br />
Die Kugelpositon kann sich ständig ändern, weshalb sich auch der Ausgabewert des Programmes ändert. Matlab muss ständigen Zugriff auf diesen Wert haben. Eine Verzögerung größer als 0,2 Sekunden wäre zu viel.</p>
<p>Ich hoffe jemand kann mir helfen.<br />
Danke!</p>
<pre><code>#ifdef _CH_
#pragma package &lt;opencv&gt;
#endif

#ifndef _EiC
#include &quot;cv.h&quot;
#include &quot;highgui.h&quot;
#include &lt;stdio.h&gt;
#include &lt;ctype.h&gt;
#endif

int main()
{
    char Vid[] = &quot;WebCam&quot;;

    IplImage * frm; // erstellt objekt &quot;frm&quot;
    IplImage * cimg;
    IplImage * cimg2;
    CvCapture * capture; // erstellt objekt &quot;capture&quot;
    int x=640;
    int y=1;
    capture = cvCaptureFromCAM(0); // capture liest ein Bild von der Kamera ein
    CvScalar sl1;
    CvScalar sl2;
    CvScalar sr1;
    CvScalar sr2;

    if(!cvGrabFrame(capture))      // can't capture a frame 
        {              
        printf(&quot;Could not grab a frame\n\7&quot;);
        exit(0);
        }
 if( capture ) 
        {
        cvNamedWindow (Vid); //erstellt fenster &quot;vid&quot;

        do 
           {
            frm = cvQueryFrame( capture );
            cimg = cvRetrieveFrame(capture);           // retrieve the captured frame
            cvSetImageROI (cimg, cvRect(0, 220, x, y)); //Region of interest wird definiert um später in frmbw2 kopiert zu werden
            IplImage* frmbw2=cvCreateImage(cvSize(x,y),IPL_DEPTH_8U,1); //erstellt &quot;frmbw&quot; mit 640x1pixeln und 8 bit sw
            cvCvtColor(cimg,frmbw2,CV_BGR2GRAY); // frm -&gt; frmbw (ROI von cimg wird in frmbw2 kopiert und in schwarz weiß gewandelt
            cvResetImageROI(cimg);
            cvSmooth(frmbw2, frmbw2, CV_GAUSSIAN, 5, 5 ); // glättet frmbw mit gauss filter

            for (int i = 0; i&lt;(x-14);i++)
                {
                sl1=cvGet2D(frmbw2,0,i); // grauwert des iten pixels wird ausgelesen
                sl2=cvGet2D(frmbw2,0,i+3); //grauwert des iten+3 pixels wird ausgelesen
                double sl1d = sl1.val[0];
                double sl2d= sl2.val[0];
                double diff =(sl1d-sl2d); // differenz aus beiden grauwerten

                if (diff&gt;20)              //wenn die differenz zwischen den beiden pixeln groß genug ist (vermutlich linke kante der kugel)
                   {
                   sr1=cvGet2D(frmbw2,0,i+11); //gleiches prozedere für die rechte kante der kugel
                   sr2=cvGet2D(frmbw2,0,i+14);
                   double sr1d = sr1.val[0];
                   double sr2d= sr2.val[0];
                   double diff2=sr2d-sr1d;
                   int i2=i+7;
                   if (diff2&gt;20)
                      {
/*!!!!!!!!!!!!!!*/    [b]printf(&quot;kugelmittelpunkt wohl bei =%i\n&quot;,i2);//dieser Wert muss nach Matlab[/b]
                      }
                   }
                }
            printf (&quot;n&quot;);//um zu signalisieren, dass ein neues bild eingelesen wird
                                          if( frm )                                
                                            cvShowImage (Vid, frmbw2);

                                           int k = cvWaitKey( 1 );
                                                if (k == 27 || k == '\r') // Press ESC and Enter 
                                                break;                     // for out
            } while( frm );
            {cvDestroyWindow( Vid ); // Destroy the window
            cvReleaseCapture( &amp;capture );
        }
        } else
             puts( &quot;Can not Open the Webcam&quot; );
             return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1774739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774739</guid><dc:creator><![CDATA[frederenke]]></dc:creator><pubDate>Tue, 08 Sep 2009 16:23:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Wed, 09 Sep 2009 14:37:52 GMT]]></title><description><![CDATA[<p>Du prüfst kaum Rückgabewerte und gibst angeforderte Resourcen nicht immer wieder frei.</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;

int main()
{
	const char Vid[] = &quot;WebCam&quot;;
	int x = 640;
	int y = 1;
	int key;
	CvCapture *capture = cvCaptureFromCAM(0);

	if (!capture) {
		fprintf(stderr, &quot;Can not Open the Webcam\n&quot;);
		return -1;
	}

	cvNamedWindow(Vid);

	for (key = 0; key != 27 &amp;&amp; key != '\r'; key = cvWaitKey(1)) {
		IplImage *subfrm, *frm = cvQueryFrame(capture);

		if (!frm)
			break;

		cvSetImageROI(frm, cvRect(0, 220, x, y));
		subfrm = cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 1);

		if (subfrm) {
			cvCvtColor(frm, subfrm, CV_BGR2GRAY);
			cvResetImageROI(frm);
			cvSmooth(subfrm, subfrm, CV_GAUSSIAN, 5, 5);
			for (int i = 0; i &lt; x - 14; i++) {
				double pl1 = cvGet2D(subfrm, 0, i).val[0];
				double pl2 = cvGet2D(subfrm, 0, i + 3).val[0];

				if (pl1 - pl2 &gt; 20) { // Differenz groß genug, evtl linke Kante der Kugel
					double pr1 = cvGet2D(subfrm, 0, i + 11).val[0];
					double pr2 = cvGet2D(subfrm, 0, i + 11 + 3).val[0];
					if (pr2 - pr1 &gt; 20) { // Differenz groß genug, evtl rechte Kante der Kugel
						printf(&quot;kugelmittelpunkt wohl bei = %i\n&quot;,i + 7);//dieser Wert muss nach Matlab
					}
				}
			}
			fprintf(stderr, &quot;.&quot;);
			cvShowImage(Vid, subfrm);
			cvReleaseImage(subfrm);
		}
	}

	cvDestroyWindow(Vid);

	cvReleaseCapture(&amp;capture);

	return 0;
}
</code></pre>
<p>Schau dir mal die benutzen <a href="http://opencv.willowgarage.com/documentation/index.html" rel="nofollow">Befehle</a> an und achte darauf, ob es Fehler geben kann und ob Resourcen angefordert werden, die wieder freigegeben werden müssen.</p>
<p>Wegen Matlab musst du gucken, was du genau willst. Die Daten in Matlab? Nur Matlabfunktionen benutzen? Wieso das Limit von 0,2 s? Aber mit Matlab kenn ich mich eh nicht so sonderlich gut aus...<br />
<a href="http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_external/bp_kqh7.html" rel="nofollow">http://www.mathworks.com/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1774780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1774780</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Wed, 09 Sep 2009 14:37:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Wed, 09 Sep 2009 08:43:32 GMT]]></title><description><![CDATA[<p>Vielen Dank schonmal! Ich werde das mit den Ressourcen mal überprüfen.<br />
Wegen Matlab;<br />
Ich erkläre erstmal mein Projekt. Ich beue eine Wippe ähnlich dieser hier<br />
<a href="http://www.youtube.com/watch?v=sx2oCmuyQuY" rel="nofollow">http://www.youtube.com/watch?v=sx2oCmuyQuY</a><br />
Matlab steuert dabei den Servo an, der die Wippe neigt. Die Kugelposition wird von dem C Programm bestimmt.<br />
Matlab braucht einfach nur den Wert dieser Kogelposition als Variable. Bzw Simulink braucht den Wert als Eingang (In). Die 0,2Sek waren einfach nur als Beispiel für die Größenordnung aus dem Raum gegriffen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1775024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775024</guid><dc:creator><![CDATA[frederenke]]></dc:creator><pubDate>Wed, 09 Sep 2009 08:43:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Wed, 09 Sep 2009 13:44:04 GMT]]></title><description><![CDATA[<p>Man kann wohl auf Programme per TCP/IP zugreifen:<br />
<a href="http://www.mathworks.com/tcpip" rel="nofollow">http://www.mathworks.com/tcpip</a></p>
<p>Oder aber man erstellt ein sogenanntes MEX-File, also eine dynamisch ladbare Bibliothek, die irgendwie(tm) die Daten zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1775301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775301</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Wed, 09 Sep 2009 13:44:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Wed, 09 Sep 2009 14:35:14 GMT]]></title><description><![CDATA[<p>Über diese Mex Files hab ich jetzt auch schon mal was gehört. Ich werde der Sache mal nachgehen und Alarm schlagen wenn ich das hinbekommen habe.<br />
Zurück zum anderen Problem.<br />
Ich habe jetzt geschlagene 5h <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> über dem Programm gehockt und vor mich hin und her probiert und ich finde den Übeltäter nicht.<br />
Ich weiß nicht was ich noch wo releasen soll, damit es geht und ob das überhaupt die Lösung des Problems ist.<br />
Ich habe deinen Code ein wenig umgebaut:</p>
<pre><code>#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

#include &lt;cv.h&gt;
#include &lt;highgui.h&gt;

int main()
{
    const char Vid[] = &quot;WebCam&quot;;
    int x = 640;
    int y = 1;
    int key;
    CvCapture *capture = cvCaptureFromCAM(0);

    if (!capture) 
    {
    fprintf(stderr, &quot;Can not Open the Webcam\n&quot;);
    return -1;
    }

    cvNamedWindow(Vid);

    for (key = 0; key != 27 &amp;&amp; key != '\r'; key = cvWaitKey(1)) 
    {
    IplImage *subfrm, *frm = cvQueryFrame(capture);

        if (!frm)
            break;

        cvSetImageROI(frm, cvRect(0, 220, x, y));
        subfrm = cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 1);
        cvCvtColor(frm, subfrm, CV_BGR2GRAY);
        cvResetImageROI(frm);

        cvSmooth(subfrm, subfrm, CV_GAUSSIAN, 5, 5);
            for (int i = 0; i &lt; x - 14; i++) 
            {
            double pl1 = cvGet2D(subfrm, 0, i).val[0];
            double pl2 = cvGet2D(subfrm, 0, i + 3).val[0];

                if (pl1 - pl2 &gt; 20) // Differenz groß genug, evtl linke Kante der Kugel
                { 
                double pr1 = cvGet2D(subfrm, 0, i + 11).val[0];
                double pr2 = cvGet2D(subfrm, 0, i + 11 + 3).val[0];
                       if (pr2 - pr2 &gt; 20) // Differenz groß genug, evtl rechte Kante der Kugel
                       { 
                       printf(&quot;kugelmittelpunkt wohl bei = %i\n&quot;,i + 7);//dieser Wert muss nach Matlab
                       }
                }
            }
            fprintf(stderr, &quot;.&quot;);
            cvShowImage(Vid, subfrm);
            cvReleaseImage(&amp;subfrm);
    }

    cvDestroyWindow(Vid);

    cvReleaseCapture(&amp;capture);

    return 0;
}
</code></pre>
<p>Das</p>
<pre><code>if (subfrm)
</code></pre>
<p>habe ich rausgenommen. Ist das OK so? Und dann habe ich vor dem letzten subfrm (Zeile54) ein &amp; gesetzt. Vorher hatte sich mein Compiler über diese Zeile beschwert.<br />
Nun beschwert er sich nicht mehr - was für mich immer der einzige Hinweis auf Fehler ist, da ich bei dem ganzen Zeigerkram immer den Überblick verliere.<br />
Was ich noch probiert habe, war die Schleifen nach und nach rauszunehmen und zu schauen ob das Programm dann auch abschmiert.<br />
Angefangen habe ich bei dieser hier:</p>
<pre><code>if (pr2 - pr2 &gt; 20) // Differenz groß genug, evtl rechte Kante der Kugel
                       { 
                       printf(&quot;kugelmittelpunkt wohl bei = %i\n&quot;,i + 7);//dieser Wert muss nach Matlab
                       }
</code></pre>
<p>Nimmt man sie raus, stürzt das Programm immernoch bei der gleichen Stelle ab.<br />
Gleiches gilt für die übergeordnete if-Schleife. Auch ohne die stürzt das Programm ab.<br />
Nehme ich jedoch diese For-Schleife raus, stürzt das Programm nicht ab.</p>
<pre><code>for (int i = 0; i &lt; x - 14; i++) 
            {
            double pl1 = cvGet2D(subfrm, 0, i).val[0];
            double pl2 = cvGet2D(subfrm, 0, i + 3).val[0];

                if (pl1 - pl2 &gt; 20) // Differenz groß genug, evtl linke Kante der Kugel
                { 
                double pr1 = cvGet2D(subfrm, 0, i + 11).val[0];
                double pr2 = cvGet2D(subfrm, 0, i + 11 + 3).val[0];
                       if (pr2 - pr2 &gt; 20) // Differenz groß genug, evtl rechte Kante der Kugel
                       { 
                       printf(&quot;kugelmittelpunkt wohl bei = %i\n&quot;,i + 7);//dieser Wert muss nach Matlab
                       }
                }
            }
</code></pre>
<p>Auch wenn ich das Suchintervall kleiner mache indem ich x-14 durch zb. x-300 ersetze, dann hält das Programm länger durch, stürzt aber irgendwann auch ab.<br />
Ich vermute jetzt einfach mal, dass es mit den</p>
<pre><code>double pl1 = cvGet2D(subfrm, 0, i).val[0];
double pl2 = cvGet2D(subfrm, 0, i + 3).val[0];
</code></pre>
<p>zusammenhängt. Jedoch weiß ich wirklich nicht was daran falsch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1775359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775359</guid><dc:creator><![CDATA[frederenke]]></dc:creator><pubDate>Wed, 09 Sep 2009 14:35:14 GMT</pubDate></item><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Wed, 09 Sep 2009 15:24:20 GMT]]></title><description><![CDATA[<p>frederenke schrieb:</p>
<blockquote>
<p>Über diese Mex Files hab ich jetzt auch schon mal was gehört. Ich werde der Sache mal nachgehen und Alarm schlagen wenn ich das hinbekommen habe.</p>
</blockquote>
<p><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>
<p>frederenke schrieb:</p>
<blockquote>
<p>Zurück zum anderen Problem.<br />
Das</p>
<pre><code>if (subfrm)
</code></pre>
<p>habe ich rausgenommen. Ist das OK so? Und dann habe ich vor dem letzten subfrm (Zeile54) ein &amp; gesetzt. Vorher hatte sich mein Compiler über diese Zeile beschwert.</p>
</blockquote>
<p>Wieso hast du die Überprüfung rausgenommen ob überhaupt ein neues Bild erstellt werden konnte? Also das if solltest du drin lassen.<br />
Das mit dem &amp;, da hast du Recht <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>
<p>frederenke schrieb:</p>
<blockquote>
<p>Was ich noch probiert habe, war die Schleifen nach und nach rauszunehmen und zu schauen ob das Programm dann auch abschmiert.<br />
Nehme ich jedoch diese For-Schleife raus, stürzt das Programm nicht ab.<br />
Ich vermute jetzt einfach mal, dass es mit den</p>
<pre><code>double pl1 = cvGet2D(subfrm, 0, i).val[0];
double pl2 = cvGet2D(subfrm, 0, i + 3).val[0];
</code></pre>
<p>zusammenhängt. Jedoch weiß ich wirklich nicht was daran falsch ist.</p>
</blockquote>
<p>Nimm doch bitte die [cpp] ... [/cpp] Tags.</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;

int main()
{
	const char Vid[] = &quot;WebCam&quot;;
	int x = 640;
	int y = 1;
	int key;
	CvCapture *capture;

	cvSetErrMode(CV_ErrModeSilent);

	capture = cvCaptureFromCAM(0);

	if (!capture) {
		fprintf(stderr, &quot;Can not Open the Webcam\n&quot;);
		return -1;
	}

	cvNamedWindow(Vid);

	for (key = 0; key != 27 &amp;&amp; key != '\r'; key = cvWaitKey(1)) {
		IplImage *subfrm, *frm = cvQueryFrame(capture);

		if (!frm)
			break;

		cvSetImageROI(frm, cvRect(0, 220, x, y));
		subfrm = cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 1);

		if (subfrm) {
			cvCvtColor(frm, subfrm, CV_BGR2GRAY);
			cvResetImageROI(frm);
			cvSmooth(subfrm, subfrm, CV_GAUSSIAN, 5, 5);
/*			for (int i = 0; i &lt; x - 14; i++) {
				double pl1 = cvGet2D(subfrm, 0, i).val[0];
				double pl2 = cvGet2D(subfrm, 0, i + 3).val[0];

				if (pl1 - pl2 &gt; 20) { // Differenz groß genug, evtl linke Kante der Kugel
					double pr1 = cvGet2D(subfrm, 0, i + 11).val[0];
					double pr2 = cvGet2D(subfrm, 0, i + 11 + 3).val[0];
					if (pr2 - pr1 &gt; 20) { // Differenz groß genug, evtl rechte Kante der Kugel
						printf(&quot;kugelmittelpunkt wohl bei = %i\n&quot;,i + 7);//dieser Wert muss nach Matlab
					}
				}
			}*/
			fprintf(stderr, &quot;.&quot;);
			cvShowImage(Vid, subfrm);
			cvReleaseImage(&amp;subfrm);
		} else
			fprintf(stderr, &quot;Create subfrm failed: %s\n&quot;, cvErrorStr(cvGetErrStatus()));

	}

	cvDestroyWindow(Vid);

	cvReleaseCapture(&amp;capture);

	return 0;
}
</code></pre>
<p>Was gibt das denn aus? Punkte?<br />
Wenn das funktioniert, setzt mal <code>double pl1 = cvGet2D(subfrm, 0, 0).val[0];</code> genau vor die auskommentierte Schleife. Was passiert dann?</p>
<p>Achja, das Abstürzen, wie hat sich das genau bemerkbar gemacht?<br />
(Hab jetzt mal die Fehlerbehandlung von OpenCV in Zeile 16 auf normales Verhalten eingestellt. Sonst bricht das Program nach einem Fehler einfach ab.)<br />
Evtl. kannst du ja noch eine Zeile wie 56 hinter das cvGet2D setzen. Vielleicht ist da ein Fehler!?</p>
<p>EDIT:<br />
Was mir jetzt erst auffällt, gibt man nicht normalerweile immer x, y an? Für das cvGet2D?<br />
Und dann nochmal bischen weitergeguckt, <code>double cvGetReal2D(const CvArr* arr, int idx0, int idx1)</code> scheint genau das zu sein, was du an sich willst <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/1775389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775389</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Wed, 09 Sep 2009 15:24:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Thu, 10 Sep 2009 15:05:57 GMT]]></title><description><![CDATA[<p>HA! es läuft! endlich!<br />
DANKE!!</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;

int main()
{
    const char Vid[] = &quot;WebCam&quot;;
    int x = 640;
    int y = 1;
    int key;
    CvCapture *capture;

    cvSetErrMode(CV_ErrModeSilent);

    capture = cvCaptureFromCAM(0);

    if (!capture) {
        fprintf(stderr, &quot;Can not Open the Webcam\n&quot;);
        return -1;
    }

    cvNamedWindow(Vid);

    for (key = 0; key != 27 &amp;&amp; key != '\r'; key = cvWaitKey(1)) {
        IplImage *subfrm, *frm = cvQueryFrame(capture);

        if (!frm)
            break;

        cvSetImageROI(frm, cvRect(0, 220, x, y));
        subfrm = cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 1);

        if (subfrm) {
            cvCvtColor(frm, subfrm, CV_BGR2GRAY);
            cvResetImageROI(frm);
            cvSmooth(subfrm, subfrm, CV_GAUSSIAN, 5, 5);
            for (int i = 0; i &lt; x - 14; i++) {
                double pl1 = cvGetReal2D(subfrm, 0, i);
                double pl2 = cvGetReal2D(subfrm, 0, i+3);

                if (pl1 - pl2 &gt; 20) { // Differenz groß genug, evtl linke Kante der Kugel
                    double pr1 = cvGetReal2D(subfrm, 0, i+11);
                    double pr2 = cvGetReal2D(subfrm, 0, i+11+3);
                    if (pr2 - pr1 &gt; 20) { // Differenz groß genug, evtl rechte Kante der Kugel
                        printf(&quot;kugelmittelpunkt wohl bei = %i\n&quot;,i + 7);//dieser Wert muss nach Matlab
                    }
                }
            }
            fprintf(stderr, &quot;.&quot;);
            cvShowImage(Vid, subfrm);
            cvReleaseImage(&amp;subfrm);
        } else
            fprintf(stderr, &quot;Create subfrm failed: %s\n&quot;, cvErrorStr(cvGetErrStatus()));

    }

    cvDestroyWindow(Vid);

    cvReleaseCapture(&amp;capture);

    return 0;
}
</code></pre>
<p>Es war wirklich das cvGet2D. Aber wie genau hast du erkannt, dass es das getReal2d sein muss?<br />
Ich mach mich dann mal an die MEX files <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 />
Nochmal einen riesen Dank - ich bin hier gestern schon ziemlich verzweifelt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1775982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775982</guid><dc:creator><![CDATA[frederenke]]></dc:creator><pubDate>Thu, 10 Sep 2009 15:05:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Thu, 10 Sep 2009 15:07:00 GMT]]></title><description><![CDATA[<p>Ich bin so blind......<br />
Scalar != Double <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/1775984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775984</guid><dc:creator><![CDATA[frederenke]]></dc:creator><pubDate>Thu, 10 Sep 2009 15:07:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wert von C++ nach Matlab übergeben on Wed, 30 Sep 2009 11:54:56 GMT]]></title><description><![CDATA[<p>eine kurze Rückmeldung, fall mal jemand diesen Thread ausgraben sollte.<br />
Ich habe das Problem komplett in C gelöst und habe die Sache mit den MEX-Files hinten angestellt.<br />
Es hatte ziemlich lange gedauert, bis ich zwei Versionen von Matlab und Visual C++ gefunden habe, die zusammenarbeiten.<br />
Sollte jemand das hier nochmal brauchen - es gibt auf der Mathworks Seite eine Kompabilitätsliste von C Compilern und entsprechenden Matlab Versionen.<br />
Also erst checken ob eure Versionen zusammenspielen und dann mit der MEX-Files Anleitung (auch auf der Mathworks Seite) rumspielen.</p>
<p>Vielen Dank nochmal an lagalopex für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786457</guid><dc:creator><![CDATA[frederenke]]></dc:creator><pubDate>Wed, 30 Sep 2009 11:54:56 GMT</pubDate></item></channel></rss>