참고 자료 : 

https://www.bogotobogo.com/Qt/Qt5_QTcpSocket.php , 

https://doc.qt.io/qt-5/qtnetwork-fortuneserver-example.html

https://walkinpcm.blogspot.com/2016/05/python-python-opencv-tcp-socket-image.html


조만간 UDP예제도 업로드 하겠습니다.

Python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import socket
from tkinter.filedialog import *
import math
import struct
 
 
#########################################
##############  영 상 수 신 ###############
#########################################
 
def recvall(sock, count):
    buf = b''
    while count:
        newbuf = sock.recv(count)
        if not newbuf: return None
        buf += newbuf
        count -= len(newbuf)
    return buf
 
 
RECV_TCP_IP    = 'localhost'
RECV_TCP_PORT  = 1234
 
 
= socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((RECV_TCP_IP, RECV_TCP_PORT))
s.listen(True)
 
conn, addr = s.accept()
print(conn)
print(addr)
 
 
 
i_totLength  = int.from_bytes(recvall(conn, 4), byteorder='big')
b_totData    = recvall(conn, i_totLength - 4)
b_meta       = b_totData[0   : 200]
b_img        = b_totData[200 : ]
 
print(b_meta.decode("utf-8"))   #메타 데이터
 
print(len(b_meta))
print(len(b_img))               #이미지 데이터
 
 
 
 
##############################################
##############  영 상 처 리  시작 ###############
##############################################
 
 
#########################################
##############  상 수 선 언 ###############
#########################################
 
 
inImage, outImage = [], [];
inH, inW, outH, outW = [0* 4
window, canvas, paper = None, None, None
 
 
#########################################
##############  함 수 선 언 ###############
#########################################
 
 
def malloc(h, w, initValue = 0) :
    l = []
    for i in range(h) :
        tmpList = []
        for j in range(w) :
            tmpList.append(initValue)
        l.append(tmpList)
    return l
 
 
 
def loadImage():
    global window, canvas, paper, filename, inImage, outImage, inH, inW, outH, outW
    fsize = len(b_img)  # 파일의 크기(바이트)
    inH = inW = int(math.sqrt(fsize)) 
    ## 입력영상 메모리 확보 ##
    inImage = []
    inImage = malloc(inH, inW)
 
    # 바이트 --> 2중 리스트
    for i in range(inH):
        for k in range(inW):
            inImage[i][k] = int(b_img[ (i * inH) + k ])
 
 
 
def sendImage():
    global window, canvas, paper, filename, inImage, outImage, inH, inW, outH, outW
 
    b_img = bytearray()
 
    for i in range(outH):
        for k in range(outW):
            b_img += struct.pack('B', outImage[i][k])
 
    print(len(b_img))
    print(type(b_img))
 
    conn.send(b_img)
 
def equalImage():
    global window, canvas, paper, filename, inImage, outImage, inH, inW, outH, outW
    ## 출력영상 크기 결정 ##
    outH = inH;
    outW = inW;

    ###### 메모리 할당 ################
    outImage = [];
    outImage = malloc(outH, outW)

    ####### Equal 알고리즘 #####
    for i in range(inH):
        for k in range(inW):
            outImage[i][k] = inImage[i][k]
 
    sendImage()
 
 
 
if __name__ == '__main__':
    loadImage()
    equalImage()
 
 
 
###########################################
########### 디버깅용 시각화 코드 ##############
###########################################
 
 
# def displayImage():
#     global window, canvas, paper, filename, inImage, outImage, inH, inW, outH, outW

#     if canvas != None:  # 중복 실행 방지.
#         canvas.destroy()

#     ## 화면 크기를 조절
#     window.geometry(str(outH) + 'x' + str(outW))  
#     canvas = Canvas(window, height=outH, width=outW)  
#     paper = PhotoImage(height=outH, width=outW)  
#     canvas.create_image((outH // 2, outW // 2), image=paper, state='normal')

#     ## 캔버스 출력 ##
#     # for i in range(outH) :
#     #     for k in range(outW) :
#     #         r = g = b = int(outImage[i][k])
#     #         paper.put("#%02x%02x%02x" % (r, g, b), (k, i))
#
#     # 성능 개선
#     rgbStr = ''  # 전체 픽셀의 문자열을 저장
#     for i in range(outH):
#         tempStr = ''
#         for k in range(outW):
#             r = g = b = int(outImage[i][k])
#             tempStr += ' #%02x%02x%02x' % (r, g, b)
#         rgbStr += '{' + tempStr + '} '
#     paper.put(rgbStr)
#
#
#     canvas.pack(expand=1, anchor=CENTER)
 
# window = Tk()  # 윈도우 생성
# window.geometry("500x500") 
#
# loadImage()
# equalImage()
#
# window.mainloop()
 
 
cs



C++


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
 
 
/////////////////////////////////////////
///////    Constant Values    ///////////
/////////////////////////////////////////
 
const int TIMEOUT = 3 * 1000// 3 seconds

/////////////////////////////////////////
///////    Global Variables   ///////////
/////////////////////////////////////////


int
 (*inImg5)[512= new int[512][512];
int (*inImg2)[256= new int[256][256];
int (*inImg1)[128= new int[128][128];
 
int (*outImg5)[512= new int[512][512];
int (*outImg2)[256= new int[256][256];
int (*outImg1)[128= new int[128][128];
 


/////////////////////////////////////////
////////     MainWindow        //////////
/////////////////////////////////////////
 
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    createThreads();
    makeConnections();
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
 
/////////////////////////////////////////
///////        Threads        ///////////
/////////////////////////////////////////
 
void MainWindow::createThreads(){
 
    sw = new SocWorker();
    sw->moveToThread(&socThread);
    socThread.start();
 
}
 
 
 
/////////////////////////////////////////
///////     Connections       ///////////
/////////////////////////////////////////
 
void MainWindow::makeConnections(){
 
    connect(&socThread , &QThread::finished       , sw   , &QObject::deleteLater       );
    connect(this       , &MainWindow::askCon      , sw   , &SocWorker::connectServer   );
    connect(sw         , &SocWorker::sendMsg      , this , &MainWindow::putStatus      );
    connect(sw         , &SocWorker::resultReady  , this , &MainWindow::handleResults  );
    connect(this       , &MainWindow::askTask     , sw   , &SocWorker::onAskTask       );
 
}
 
 
 
 
/////////////////////////////////////////
///////   MainWindow Funtions    ////////
/////////////////////////////////////////
 
void MainWindow::on_openInImage_triggered()
{
    QString path = path_dial(this);
    emit askTask(path, 0);
    ui->tab_right->setCurrentIndex(1);
 
}
 
 
void MainWindow::on_btn_connect_clicked()
{
    emit askCon(ui->edit_host->text(),  ui->edit_port->text().toInt());
}
 
 
/// 구현 예정 //
void MainWindow::on_btn_bright_clicked()
{
 
}
 
 
 
 
void MainWindow::handleResults(QByteArray _recvImg ){
    qDebug() << __func__;
    lab_pix(pix_img(img_ba(_recvImg)), ui->label_img);
 
    qDebug() << "end recv...";
 
}
 
void MainWindow::putStatus(QString _text){
 
    ui->statusBar->showMessage(_text,10000);
 
}
 
 
 
 
 
/////////////////////////////////////////
///////  Socket Worker Class  ///////////
/////////////////////////////////////////
 
SocWorker::SocWorker(){
 
    sendSock = new QTcpSocket(this);
    connect(sendSock, &QTcpSocket::connected     , this&SocWorker::onServerConnected);
 
}
 
void SocWorker::onServerConnected(){
    qDebug() << __func__;
 
    emit sendMsg("conection to server sucessed...!");
}
 
 
void SocWorker::connectServer(const QString _addr, const int _port){
    qDebug() << __func__;
 
    sendSock->connectToHost(_addr, _port);
 
 
    if(!sendSock->waitForConnected(TIMEOUT)){
        emit sendMsg("server is not responding");
    }
 
}
 
 
 
void SocWorker::onAskTask(QString _fPath, int _mode, QString _option){
    qDebug() << __func__;
    QByteArray proc = createProc(_fPath, _mode, _option);
 
    sendSock->write(proc);
    sendSock->waitForBytesWritten(1000);
    sendSock->waitForReadyRead(3000);

    qDebug() << "Reading: " << sendSock->bytesAvailable();
 
    QByteArray recvData = sendSock->readAll();

    emit resultReady(recvData);
 
}
 
 
cs


+ Recent posts