用SOCKET发送OpenCV的IplImage结构

本文档介绍如何在C/S架构的Image Processing程序中,通过SOCKET发送OpenCV的IplImage结构。针对IplImage结构的复杂性,文中详细解析了发送和接收过程,并提醒读者在接收后不应使用CvReleaseImage释放资源,推荐使用特定方式释放。同时,给出了数据包头的简单定义示例。
摘要由CSDN通过智能技术生成

做一个C/S架构的Image Processing的程序,其中读写图片和图像处理的部分都是用OpenCV来实现的。本人原先没有怎么接触过SOCKET编程,网上也没有找到怎么发送一个类似IplImage结构这样文章,之后自己解决了,所以把CSDN的博客开了写一篇这个,自己记录一下,也方便像我一样的初学者。

对于一般的结构例如CvPoint,我们首先来看一下CvPoint的结构

typedef struct CvPoint
{
    int x;
    int y;
}
CvPoint;

如果要发送一个CvPoint的话可以使用以下语句

CvPoint point(1, 1);
send(s, (char*)&point, sizeof(CvPoint), 0);


这里使用的是TCP,阻塞模式的SOCKET(下同)。那么如果要在客户端接受这个CvPoint结构则可以这样:

CvPoint p;
recv(s, (char*)&p, sizeof(CvPoint), 0);
实际上这种发送接受的结构类似于memcpy,发送的过程就是将内存中指向point所占空间的开始地址接连的sizeof(CvPoint)个字节的内容(实际上就是point的内容)拷贝到发送缓冲区中等待发送。

而接受则是将当前接收缓冲区中的内容连续拷贝sizeof(CvPoint)个字符到以&p为起点的内存空间中。比较简略的示意图如下所示

这时候实际上采用什么类型的指针来作为index都是无所谓的。例如&p为0x00cd4360,这时候声明一个int类型的指针指向p的话同样也是指向0x00cd4360.唯一不同的是如果你把它指向的地址元素以int形式取出来可能结果会很怪,另外int类型指针增加的话是跨越2个字节而不是1个。所以这里即使是用BYTE*代替char*都是可以的。

所以可能像我一样的初学者就觉得这样就可以如法炮制传送IplImage结构了,其实不是这样的。首先来分析一下IplImage的结构:

typedef struct _IplImage
{
    int  nSize;             /* sizeof(IplImage) */
    in
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值