AR.DRONE2 win32下非sdk 读取摄像头信号完整成功
经过艰苦的努力,终于不再丢帧,不再错帧,yuv转rgb也有了,感谢https://projects.ardrone.org/boards/1/topics/show/4282#message-4655
里面的 jiahui chen
现在已经能得到AR.DRONE2完整稳定的图像了,整个工程很乱,我就不上传整个工程了,就贴个关键代码
#include "h264.h"
void Car2_2Dlg::OnBnClickedOk()
{
CSocket vi;
vi.Create(5555,SOCK_STREAM,"192.168.1.3");
vi.Connect("192.168.1.1",5555);
H264 h1;
IplImage* dspimg=cvCreateImage(cvSize(640,360),IPL_DEPTH_8U,3);
dspimg->imageData=(char*)h1.getImage();
dspimg->origin=1;
int i=1;
char buf;
int recv;
while(i==1)
{
recv=vi.Receive(buf,123456);
h1.add((unsigned char*)buf,recv);
h1.getImage();
cvShowImage("",dspimg);
int k=cvWaitKey(20);
if(k==32) i=0;
}
vi.Close();
}
void H264::add( unsigned char *buffer, int size )
{
if( bufferSize + size < maxBufferSize ) {
memcpy( this->buffer + bufferSize, buffer, size );
bufferSize += size;
}
}
//---------------------------------------------------------------------------
unsigned char *H264::getImage()
{
char b[ 200 ];
unsigned short int *p16;
int header, payload;
int moreFrames;
moreFrames = 1;
while( moreFrames == 1 ) {
moreFrames = 0;
for( int i = 0; i < bufferSize; i++ ) {
if( ( buffer[ i ] == 'P' ) &&
( buffer[ i + 1 ] == 'a' ) &&
( buffer[ i + 2 ] == 'V' ) &&
( buffer[ i + 3 ] == 'E' ) ) {
// sprintf( b, "paVE %d =================", i );
// FormMain->Memo->Lines->Add( b );
// sprintf( b, "version %d", buffer[ i + 4 ] );
// FormMain->Memo->Lines->Add( b );
// sprintf( b, "video codec %d", buffer[ i + 5 ] );
// FormMain->Memo->Lines->Add( b );
p16 = ( unsigned short int * )( buffer + i + 6 );
header = *p16;
// sprintf( b, "header size %d", header );
// FormMain->Memo->Lines->Add( b );
p16 = ( unsigned short int * )( buffer + i + 8 );
payload = *p16;
// sprintf( b, "payload size %d", payload );
// FormMain->Memo->Lines->Add( b );
// sprintf( b, "frame type %d", buffer[ i + 30 ] );
// FormMain->Memo->Lines->Add( b );
if( header + payload < bufferSize ) {
currFrameSize = header + payload;
memcpy( currFrame, buffer + i, currFrameSize );
memcpy( buffer, buffer + currFrameSize, bufferSize - currFrameSize );
bufferSize -= currFrameSize;
addFrame( currFrame, currFrameSize );
// convert image for display
unsigned char *src, *dst;
unsigned char *p, q;
src = outBuffer + 359 * 640 * 3;
dst = displayBuffer;
for( int j = 0; j < 360; j++ ) {
memcpy( dst, src, 640 * 3 );
p = dst;
for( int i = 0; i < 640; i++ ) {
q = *p;
*p = *( p + 2 );
*( p + 2 ) = q;
p += 3;
}
dst += ( 640 * 3 );
src -= ( 640 * 3 );
}
moreFrames = 1;
} else {
moreFrames = 0;
}
break;
}
}
}
return( displayBuffer );
} 应该很快就可以做到:
1.拿个黑胶布贴在地上,飞机就顺着黑胶布的路线飞行
2.挂个人脸识别上去炫耀一下技术 好东西啊
页:
[1]