總結一下之前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;  
}  



發佈了10 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章