总结一下之前socket opencv传灰度图片

之前学过点socket编程,但是忘得差不多了,最近又重新看了一下。看本文章的人可以先了解一下socket编程的基本过程,网上有很多,博主在此就不赘述了。

直接上干货。方便刚学socket 使用opencv的新人。注:首先需要配置opencv的环境才可用啊。高手勿喷!

博主用的环境为:opencv2.4.13  +   vs2013

客户端的程序:

#include <WINSOCK2.H>  
#include <iostream>  
#include <stdio.h>  
#include <cv.h>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
using namespace cv;
using namespace std;

#pragma  comment(lib,"ws2_32.lib")  

int main(int argc, char* argv[])
{
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA data;
    if (WSAStartup(sockVersion, &data) != 0)
    {
        return 0;
    }

    SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sclient == INVALID_SOCKET)
    {
        printf("invalid socket !\n");
        return 0;
    }

    sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(8888);
    serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
    {
        printf("connect error !\n");
        closesocket(sclient);
        return 0;
    }
    //读取图像并发送  
    Mat M1 = imread("D:\\lena.bmp",0);//载入图片  
    Mat M2(M1.rows, M1.cols, CV_8UC1); //放置灰度图像  
    printf("%d*%d\n", M1.rows, M2.cols);
    M2 = M1.clone();
    int i, j;
    char sendData[1000000] = "";
    cvNamedWindow("client", 1);
    for (i = 0; i < M1.rows; i++)
    {
        uchar *data = M2.ptr<uchar>(i);
        for (j = 0; j < M1.cols; j++)
        {
            sendData[M1.rows * i + j] = (char)data[j];
        }
    }
    imshow("client", M1);
    send(sclient, sendData, 1000000, 0);//发送  
    cvWaitKey(0);//任意键发送  
    cvDestroyWindow("client");
    closesocket(sclient);
    WSACleanup();
    return 0;
}

服务端的程序:

#include <stdio.h>  
#include <winsock2.h>  
#include <cv.h>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  

#pragma comment(lib,"ws2_32.lib")  
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
    //初始化WSA  
    WORD sockVersion = MAKEWORD(2, 2);
    WSADATA wsaData;
    if (WSAStartup(sockVersion, &wsaData) != 0)
    {
        return 0;
    }
    //创建套接字  
    SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (slisten == INVALID_SOCKET)
    {
        printf("socket error !");
        return 0;
    }
    //绑定IP和端口  
    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(8888);//端口8888  
    sin.sin_addr.S_un.S_addr = INADDR_ANY;
    if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
        printf("bind error !");
    }

    //开始监听  
    if (listen(slisten, 5) == SOCKET_ERROR)
    {
        printf("listen error !");
        return 0;
    }

    //循环接收数据  
    SOCKET sClient;
    sockaddr_in remoteAddr;
    int nAddrlen = sizeof(remoteAddr);

    printf("等待连接...\n");
    do
    {
        sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
    } while (sClient == INVALID_SOCKET);
    printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));

    char revData[1000000] = "";
    Mat M(256, 256, CV_8UC1);//接收灰度图像  
    uchar *p = (uchar *)M.data;
    int i, j;
    int ret;
    while (true)
    {
        //接收数据  
        ret = recv(sClient, revData, 1000000, 0);
        if (ret > 0)
        {
            revData[ret-1] = '\0';
            for (i = 0; i < M.rows; i++)
            {
                uchar *data = M.ptr<uchar>(i);
                for (j = 0; j < M.cols; j++)
                {
                    data[j] = (uchar)revData[M.rows * i + j];
                    //cout << (int)data[j] << " ";
                }
                cout << endl;
            }
            ret = 0;
        }
        imshow("sevice", M);
        cvWaitKey(0);
    }
    cvDestroyWindow("server");
    closesocket(slisten);
    WSACleanup();
    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值