참고 자료 :
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 s = 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 |
'IPC(Pipe, Shared Mem)' 카테고리의 다른 글
QT 문자열 소스 정리 (0) | 2019.02.19 |
---|---|
아두이노 QT 시리얼 통신 바이트 에코 코드 (0) | 2019.02.19 |
윈도우즈 메세지로 COPY_DATA_STRUCT 송신부 수신부 (0) | 2019.02.18 |
Python <-> c++ PIPE, MMF 테스트 예제 최종(코드업로드) (0) | 2019.02.12 |
python <-> c++ mmf 최종테스트 데모 예제 (0) | 2019.02.12 |