c#和python的flask接口的交互

一、灰度图像的传输

c#端的传输

//读入文件夹中的图像
Mat img2 = new Mat(file, ImreadModes.AnyColor);
//将图像的数据转换成和相机相同的buffer数据
byte[] image_buffer = new byte[img2.Width * img2.Height];
int cn = img2.Channels(); //通道数
if (cn == 1)
    {
     //将图像的数据转换成和相机相同的buffer数据

      Marshal.Copy(img2.Data, image_buffer, 0, img2.Width * img2.Height);
     }

#传输
string result = RequestsPostbuffer(Url, image_buffer);

python 端的解析

receiveData = request.get_data() 

#相机的buffer转换使用
 img_cv=np.frombuffer(receiveData,dtype=np.uint8).reshape(1024,1224) #opencv格式

二、彩色图像的传送

c#端的传输

//打开图像,将图像转换成buffer用下面这段代码
            if (OpenFileDialog1.ShowDialog() == DialogResult.OK)
            {

                //读入文件夹中的图像
                Mat img2 = new Mat(OpenFileDialog1.FileName, ImreadModes.AnyColor);
                byte[] image_buffer = new byte[img2.Width * img2.Height*3];
                int cn = img2.Channels(); //通道数
                if (cn == 3)
                {

                    string show_mssage = "测试图像的通道数是:" + Convert.ToString(cn);
                    //将图像的数据转换成和相机相同的buffer数据
                    listBox1.Items.Add(show_mssage);

                    Marshal.Copy(img2.Data, image_buffer, 0, img2.Width * img2.Height);
                }
                else
                {
                    string show_mssage = "错误!!!!!!!!!!!!测试图像需要单通道的灰度图";
                    listBox1.Items.Add(show_mssage);

                }

python 端的解析

 #相机的buffer转换使用
 img_cv=np.frombuffer(receiveData,dtype=np.uint8).reshape(4096,3500,3) #opencv格式

三、整个工程的实现

python 端的实现

# !/usr/bin/python
# -*- coding: UTF-8 -*-
# python服务器如果需要访问静态的文件,都需要放到static这个指定的文件夹。


from flask import Flask, jsonify, request
from flask import render_template
from wtforms import StringField, Form
from wtforms.validators import DataRequired

import json

import cv2
import numpy as np

from comparison_boxandpdf import Comparison_boxandpdf
from skimage.segmentation import mark_boundaries

from PIL import Image

import time

import base64
import io
from io import BytesIO 

import easyocr

import halcon as ha
from halcon.numpy_interop import himage_from_numpy_array
from halcon.numpy_interop import himage_as_numpy_array

from gevent import pywsgi

import requests

from algorithm_configuration import Read_iniconfig


#异常码定义
miss_model = 0 

try:
    #*********************************初始化******************************
    Comparison_tools=Comparison_boxandpdf()

    #配置文件解析,主要是根据配置文件中pdf的路径解析出pdf的图像
    config_Path = 'C:/code/box_ocr/cinfig_ini/algorithm_configuration.ini'
    read_ini=Read_iniconfig(config_Path)
    read_bool,dict=read_ini.read_pdfbox_detection_cfg()

    #模型及图像检测加速初始化
    pdfbox_model_path=dict.get('pdfbox_model_path')
    pdfbox_ini_image_path=dict.get('pdfbox_ini_image_path')
    pdfbox_pdf_path=dict.get('pdfbox_pdf_path')
    pdfbox_easyocr_thresh=float(dict.get('pdfbox_easyocr_thresh'))
    print("模型路径",pdfbox_model_path)
    print("模型初始化加速测试图像的路径为:",pdfbox_ini_image_path)
    print("阈值",pdfbox_easyocr_thresh)
    print("PDF的路径为",pdfbox_pdf_path)
    
    # #先加载字符识别模型
    # img_init = cv2.imread(pdfbox_ini_image_path)
    # reader = easyocr.Reader(['ch_sim', 'en'], gpu=True) # 使用GPU加速
    # results_init = reader.readtext(img_init)

    halcon_find_txt_model_path='C:/code/box_ocr/model/Document_Rej.omc'

except Exception as e:
    
    print("模型路径或者测试图像的路径不正确 ", e)
finally:
    print("***********************************************算法初始化完成。可以进行通信进行检测********************************")




app = Flask(__name__)
app.logger.info('Finished Start Flask!')



# 开始数据转移
@app.route('/BOX_OCR/', methods=['POST'])
def startTransfer(name=None):
    if request.method == 'POST':
        receiveData = request.get_data()    # 接收图像的buffer数据  时间1ms

        #相机的buffer转换使用
        img_cv=np.frombuffer(receiveData,dtype=np.uint8).reshape(4096,3500,3) #opencv格式
        save_image_path_pdf='C:/code/box_ocr/debug_image_show/warpPerspective_result/empty_image_rectification.bmp'
        cv2.imwrite(save_image_path_pdf,img_cv)
        
        error_code=1
        if(error_code==1):
            data = {
                    'pdf_pdf': 1,
                    'image_path':1,
                    'number_diff_result':1,
                    'image_result':encoded_image,
                    'image_result_pdf':encoded_image_pdf
                    }
        else:
            encoded_image="no"
            encoded_image_pdf="no"
            data = {
                    'pdf_pdf': 1,
                    'image_path': 1,
                    'number_diff_result':1,
                    'image_result':encoded_image,
                    'image_result_pdf':encoded_image_pdf
                    }



        json_data = json.dumps(data)

      
      
        return json_data


if __name__ == '__main__':
    # app.run(host='127.2.2.0', port=8001, debug=True, threaded=True)
    # debug=True 时设置的多线程无效
    # 多线程和多进程功能只能开一个     1.processes=True      2.threaded=True
    server = pywsgi.WSGIServer(('127.2.2.0', 8001), app)
    server.serve_forever()

c#端的实现

//选择待检测的PDF的文件
        private void Button_读取图片2_Click(object sender, EventArgs e)
        {
            OpenFileDialog1.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
            OpenFileDialog1.Title = "选择图像文件";

            int hv_Height, hv_Width;

            string log = "";//错误信息

            if (OpenFileDialog1.ShowDialog() == DialogResult.OK)
            {
                // 获取选中的文件路径
                image_path= OpenFileDialog1.FileName;
                //string show_mssage = OpenFileDialog1.FileName;
                //listBox1.Items.Add(image_path);

                string show_mssage = "待检测的PDF文件的位置为:" + pdf_path;
                string show_mssage2 = "待检测的图像文件的位置为:" + image_path;
                listBox1.Items.Add(show_mssage);
                listBox1.Items.Add(show_mssage2);

                string path_totall = pdf_path + image_path;

                List<string> stringsList = new List<string>();

                stringsList.Add(pdf_path);
                stringsList.Add(image_path);


                string jsonParams = pdf_path + "#" + image_path;


                string paraUrlCoded = jsonParams;//System.Web.HttpUtility.UrlEncode(jsonParas);   

                byte[] payload;
                //将Json字符串转化为字节  
                payload = System.Text.Encoding.UTF8.GetBytes(jsonParams);


                string Url = "http://127.2.2.0:8001//BOX_OCR/";//功能网址

                string result = RequestsPostbuffer(Url, payload);

                if (result == null)
                {
                    
                    MessageBox.Show("结果传回出错!", "提示:");
                }
                else
                {
                    
                    if (result.Contains("default"))
                    {
                        log = "There is an error running the algorithm." + "\r\n" + result;
                    }
                    else
                    {

                        //对传送回来的结果进行解析
                        //解析对象JObject 
                        JObject jo = (JObject)JsonConvert.DeserializeObject(result);
                        string pdf_pdf = jo["pdf_pdf"].ToString();
                        string image_path = jo["image_path"].ToString();

                        string number_diff_result = jo["number_diff_result"].ToString();

                        string image_result = jo["image_result"].ToString();
                        string image_result_pdf = jo["image_result_pdf"].ToString();

                        Console.WriteLine("pdf的路径为:" + pdf_pdf);
                        Console.WriteLine("图像的路径为:" + image_path);
                        Console.WriteLine("检测到的不同之处的个数为:" + number_diff_result);

                        //解析算法处理后绘制处理后的图像-----------通过测试,回传结果图像的用时10ms不到
                        image_result = image_result.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//将base64头部信息替换
                        byte[] result_image_buffer = Convert.FromBase64String(image_result);

                        image_result_pdf = image_result_pdf.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//将base64头部信息替换
                        byte[] result_image_buffer_pdf = Convert.FromBase64String(image_result_pdf);

                        //显示图像
                        MemoryStream memStream = new MemoryStream(result_image_buffer);
                        Image mImage = Image.FromStream(memStream);
                        hv_Width = mImage.Width;
                        hv_Height = mImage.Height;


                        MemoryStream memStrea_pdf = new MemoryStream(result_image_buffer_pdf);
                        Image mImage_pdf = Image.FromStream(memStrea_pdf);
                        

                        if (PictureBox1.Image != null) PictureBox1.Image.Dispose();
                        if (PictureBox2.Image != null) PictureBox2.Image.Dispose();
                        //PictureBox1.Image = mImage.Clone(new Rectangle(0, 0, mImage.Width, mImage.Height), mImage.PixelFormat);
                        PictureBox1.Image = mImage_pdf;
                        PictureBox2.Image = mImage;


                        log = "单张图像测试成功。可以继续测试!!!!";
                        listBox1.Items.Add(log);
                    }



                }

            }
            else
            {
                MessageBox.Show("选择有误!", "提示:");
            }

        }




 /// <summary>
        /// 通过网络地址和端口访问数据
        /// </summary>
        /// <param name="Url">网络地址</param>
        /// <param name="payload">图像的buffer数据</param>
        /// <returns></returns>
        /// 客户端创建一个HTTPRequset

        public string RequestsPostbuffer(string Url, byte[] payload)
        {

            //*****************************************将客户端这边要传入的数据,进行数据 格式的转换,发送到服务端*******************************************
            string postContent = ""; // 接收服务端结果的字符串

            string strURL = Url;

            //创建一个HTTP请求  
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);

            //Post请求方式  
            request.Method = "POST";

            //内容类型  表示具体请求中的媒体类型信息,application/json表示 JSON数据格式,可以传图像格式。二进制流等,参考链接:https://www.cnblogs.com/doit8791/p/7609413.html
            request.ContentType = "application/octet-stream";

            //设置请求的ContentLength   设置要发布的字符串的内容长度。
            request.ContentLength = payload.Length;

            //发送请求,获得请求流 
            Stream writer;
            try
            {
                writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象
            }
            catch (Exception)
            {
                writer = null;
                MessageBox.Show("连接服务器失败!");
                return null;
            }

            //将请求参数写入流
            writer.Write(payload, 0, payload.Length);
            writer.Close();//关闭请求流

            //****************************************解析服务端处理的结果并返回处理结果给主程序********************************
            HttpWebResponse response;

            //检查是否收到服务端的回应,如果没有回应则错误提示
            try
            {
                //获得响应流
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                response = ex.Response as HttpWebResponse;
                postContent = "default: The response is null." + "\r\n" + "Exception: " + ex.Message;
            }

            //对服务端接收到的数据进行解析
            if (response != null)
            {
                try
                {
                    //收到服务端给的回复流
                    Stream s = response.GetResponseStream();
                    //=创建一个读流的工具
                    StreamReader sRead = new StreamReader(s);
                    //将读取的结果的传送给字符串
                    postContent = sRead.ReadToEnd();
                    //关闭读取流工具
                    sRead.Close();
                }
                catch (Exception e)
                {
                    postContent = "default: The data stream is not readable." + "\r\n" + e.Message;
                }
            }
            //将在服务端收到的解析数据回传,回传回去的是一个字符串的类型

            return postContent;//返回Json数据
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode HOT 100刷题总结

文章目录 1 哈希1.1 1-1.两数之和&#x1f7e2;1.2 2-49.字母异位词分组&#x1f7e1;1.3 3-128.最长连续序列&#x1f7e1; 2 双指针2.1 4-283.移动零&#x1f7e2;2.2 6-15.三数之和&#x1f7e1;2.3 7-11.盛最多水的容器&#x1f7e1;2.4 8-42.接雨水&#x1f534; 3 滑动窗…

传输层协议——UDP协议

目录 一、传输层 二、再谈端口号 端口号的划分 知名端口号 pidof netstat命令 三、UDP协议 1、UDP协议格式 2、UDP协议特点 3、UDP协议的缓冲区 四、基于UDP的应用层协议 一、传输层 上一篇文章我们所讲到的HTTP协议和HTTPS协议&#xff0c;是属于应用层协议。我们…

【小笔记】问答系统可视化实现的三种方式

下面三种方式都是基于Python的哈&#xff0c;从简单到复杂。 方式一&#xff1a;命令行交互问答 优点&#xff1a;原始简单直接 方式二&#xff1a;使用Python可视化框架 优点&#xff1a;无需学习前端技术栈即可搭建一个web。 streamlit&#xff1a;⭐️⭐️⭐️⭐️gra…

【服务器优化】LVS负载均衡

LVS负载均衡 LVS简介 ​ LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是由章文嵩博士主导的开源负载均衡项目&#xff0c;目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案&#xff0c;终…

nginx的应用部署nginx

这里写目录标题 nginxnginx的优点什么是集群常见的集群什么是正向代理、反向代理、透明代理常见的代理技术正向代理反向代理透明代理 nginx部署 nginx nginx&#xff08;发音同enginex&#xff09;是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&…

Java设计模式 _结构型模式_外观模式

一、外观模式 1、外观模式 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型模式。主要特点为隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这有助于降低系统的复杂性&#xff0c;提高可维护性。当客户端与多个子系统之间存在大量…

FPGA+海思ARM方案,可同时接收HDMI/VGA 两种信号,远程控制

FPGA海思ARM方案&#xff0c;可同时接收HDMI/VGA 两种信号&#xff0c;通过配置输出任一图像或者拼接后的图像 客户应用&#xff1a;无线远程控制 主要特性&#xff1a; 1.支持2K以下任意分辨率格式 2.支持H264压缩图像 3.支持WIFI/4G无线传输 4.支持自适应输入图像分辨率 …

如何编辑百度百科里面的资料

编辑百度百科资料是一个相对简单的过程&#xff0c;但同时也需要遵循一定的规则和流程。以下是百科优化网yajje整理的编辑百度百科资料的步骤和注意事项。 登录账户 首先&#xff0c;编辑百度百科需要一个百度账号。如果没有&#xff0c;你需要先注册一个。登录后&#xff0c;…

西奥机电CLRT-01:重塑碳酸饮料质检新纪元

西奥机电CLRT-01&#xff1a;重塑碳酸饮料质检新纪元 在追求品质生活的今天&#xff0c;碳酸饮料的品质检测成为了行业内外关注的焦点。西奥机电&#xff0c;作为行业创新的领跑者&#xff0c;携其最新研发的CLRT-01二氧化碳气容量测试仪&#xff0c;为碳酸饮料行业带来了革命性…

一文详解|影响成长的关键思考(二)

之前写过一篇《一文详解&#xff5c;影响成长的关键思考》&#xff0c;里面对自己工作前几年的心法进行了总结&#xff0c;并分享了出来。现在又工作了一段时间后&#xff0c;有了一些新的体会&#xff0c;想进一步分析一下&#xff0c;于是便有了此文。的确&#xff0c;思考也…

LeetCode63:不同路径Ⅱ

题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角…

【NPS】微软NPS配置802.1x,验证域账号,动态分配VLAN(NPS篇)

NPS简介 Network Policy Server&#xff08;NPS&#xff09;是微软Windows Server中的一个网络服务&#xff0c;它作为RADIUS服务器实现&#xff0c;用于集中管理网络接入请求。NPS处理对网络资源的认证、授权和审计请求&#xff0c;通常用于控制远程访问VPN和无线网络的接入。…

Python 数据库操作- sqlite3 模块

Python sqlite3 模块 1. 安装 SQLite3 可使用 sqlite3 模块与 Python 进行集成。sqlite3 模块是由 Gerhard Haring 编写的。它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。用户不需要单独安装该模块&#xff0c;因为 Python 2.5.x 以上版本默认自带了该模块…

(动画详解)LeetCode225.用队列实现栈

. - 力扣&#xff08;LeetCode&#xff09; 题目描述 解题思路 这道题的思路就是使用两个队列来实现 入栈就是入队列 出栈就是将非空队列的前n-1个元素移动到新的队列中去 再将最后一个元素弹出 动画详解 代码实现 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.…

打车遇到臭车的底层逻辑!修炼的法门居然又捡起来了!——早读(逆天打工人爬取热门微信文章解读)

冥冥之中自有天意 引言Python 代码第一篇 洞见 热搜上“打车遇到臭车”话题&#xff0c;戳到了650万成年人的尴尬第二篇 冯站长之家 三分钟新闻早餐结尾 生命不息 探索不止 在生命的旅程中 我不断探索不断发现 永不停歇 引言 记 ​一大突破 炁​机启动 ​没想到 ​去年9月份…

【NodeMCU实时天气时钟温湿度项目 3】连接SHT30传感器,获取并显示当前环境温湿度数据(I2C)

今天&#xff0c;我们开始第三个专题&#xff1a;连接SHT30温湿度传感器模块&#xff0c;获取当前环境实时温湿度数据&#xff0c;并显示在1.3寸TFT液晶显示屏上。 第一专题内容&#xff0c;请参考 【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计…

【0day漏洞复现】中移铁通禹路由器信息泄露漏洞

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

AJAX家政系统源码部署/售后更新/搭建/上线维护

基于FastAdmin和原生微信小程序开发的一款同城预约、上门服务、到店核销家政系统&#xff0c;用户端、服务端(高级授权)、门店端(高级授权)各端相互依赖又相互独立&#xff0c;支持选择项目、选择服务人员、选择门店多种下单方式&#xff0c;支持上门服务和到店核销两种服务方式…

收放卷控制系统详细算法介绍(全伺服系统)

收放卷控制系统涉及的内容非常多,这里我们介绍全伺服系统利用电子齿轮指令实现主从轴的比例随动速度控制,收放卷控制算法介绍常用链接如下 1、收放卷+排线控制 收放卷+排线控制系统框图-CSDN博客文章浏览阅读24次。1、收放卷前馈量计算FC收放卷前馈量计算FC(CODESYS ST源代…

基于51单片机的智能导盲手杖—超声波测距

基于51单片机的智能导盲手杖 &#xff08;仿真&#xff0b;程序原理图&#xff0b;PCB设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.显示前方障碍物距离。 2.实时测量距离&#xff0c;并通过蜂鸣器提醒距离过短&#xff0c;蜂鸣器蜂鸣发出预警。 3.可以通过按键调…