在控制台应用程序中显示像素值的2D数组

时间:2014-01-07 19:31:44

标签: c image sockets tcp multidimensional-array

我不断通过TCP / IP将分辨率为160x120的LabVIEW的像素值(uint32)二维数组发送到C程序。 C程序的目的是在控制台应用程序中将接收的像素值显示为2D数组。我将像素作为字节流发送,并使用Ws2_32.lib中的recv函数接收C程序中的字节。然后我将字节转换为uint32值并使用2D数组在控制台应用程序中显示它们,因此每个2D数组都代表一个图像。

我遇到了帧速率问题。我可以在LabVIEW中每秒发送30帧,但是当我用C程序打开TCP / IP连接时,帧速率下降到每秒1帧。这一定是C程序的一个问题,因为我设法用相同的LabVIEW程序将每秒所需的帧发送到相应的C#程序。

C代码:

#define DEFAULT_BUFLEN 256
#define IMAGEX 120
#define IMAGEY 160 

WSADATA wsa;
SOCKET s , new_socket;
struct sockaddr_in server , client;
int c;
int iResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
typedef unsigned int uint32_t;
unsigned int x=0,y=0,i,n;
uint32_t image[IMAGEX][IMAGEY];
size_t len;
uint32_t* p;

p = (uint32_t*)recvbuf;

do
{

iResult = recv(new_socket, recvbuf, recvbuflen, 0);

len = iResult/sizeof(uint32_t);

for(i=0; i < len; i++)
{
    image[x][y] = p[i];
    x++;
    if (x >= IMAGEX)
    {
        x=0;
        y++;
    }
    if (y >= IMAGEY)
    {
        y = 0;
        x = 0;
        //print image
        for (n=0; n< IMAGEX*IMAGEY; n++)
        {
            printf("%d",image[n%IMAGEX][n/IMAGEY]);
            if (n % IMAGEX)
            {
                printf(" ");
            }
            else
            {
                printf("\n");
            }
        }

    }
}

} while ( iResult > 0 );

2 个答案:

答案 0 :(得分:1)

尝试减少打印。由于您正在同一个线程中读取和打印,TCP连接中的数据将填满,然后它将向另一端(LABView)施加压力,LABView将停止发送数据,直到它从另一端获得绿色信号(你是C程序)

首先,您可以通过替换此

进行调试
    for (n=0; n< IMAGEX*IMAGEY; n++)
    {
        printf("%d",image[n%IMAGEX][n/IMAGEY]);
        if (n % IMAGEX)
        {
            printf(" ");
        }
        else
        {
            printf("\n");
        }
    }

与         printf(“One frame recv \ n”);

看看它是否有任何区别。我假设你的tcp连接有足够的带宽

答案 1 :(得分:0)

如果没有进一步的信息,很难诊断出来。不过,我可以提出一些建议。

首先,你的recv调用是使用一个小缓冲区,所以你花了很多时间来调用它。为什么不一次读一整帧?此外,您读入数据,然后将其复制到图像阵列。使用图像阵列本身不是更简单吗?结合这两个建议可以将整个帧直接读入图像数组,从而节省了大量时间。

问题的另一个原因可能是控制台。使用您提供的示例代码,您尝试每秒向终端写入30 * 120 * 160 = 57,600个整数值。如果带有分隔符的平均值占用8个字符,则为每秒400万个字符。完全有可能显示器不能那么快,在这种情况下,事情会备份并减慢一直到服务器写入套接字。 有几种方法可以解决这个问题,但是进入这里太过分了。