zoukankan      html  css  js  c++  java
  • opencv从txt文本读取像素点并显示

                                                                         opencv从txt文本读取像素点并显示

    文本储存格式为每行一个像素点,排列为RGB。每帧图像的帧头为65535.  如下图所示

     65535 
    24 28 16 
    24 28 16 
    32 32 24 
    32 32 32 
    32 32 32 
    40 40 40 
    56 60 56 
    88 88 88 
    112 112 112 
    112 120 112 
    112 124 120 

    废话不多说,代码如下:

    //
    #include <iostream>
    #include <opencv2opencv.hpp>
    #include <fstream>  
    #include <string>  
    #include <WINSOCK2.H>
    #include <STDIO.H>
    
    #define MAX 32
    using namespace cv;
    using namespace std;
    
    Vec3b GetPoint( void )
    {
        Vec3b pixels; //声明像素点储存变量//static int64 count = 0;cout<<count++<<endl;
        char Buf[MAX];//声明一个buf,用来储存一行 
        //声明三个空格,用于分割像素点
        int firstspace = 0; int secondspace = 0; int thirdspace = 0;
        //读取一行数据
        cin.getline(Buf,MAX);
        //如果读到的是个回车或者换行,则继续读
        while(Buf[0] == ''||Buf[0] == ' ' ) cin.getline(Buf,MAX);
        //遍历整个buf,找到三个空格的位置
        for(int i = 0 ;i < MAX ;i ++ )
        {
            if(Buf[i] == ' ') 
            {
                if(firstspace  != 0 && secondspace != 0 && thirdspace ==0) thirdspace =i;
                if(firstspace  != 0 && secondspace == 0)  secondspace = i;
                if(firstspace  == 0) firstspace  = i;
                
            }
    
        }
        //将三个空格之间的像素点解码储存
        for(int i = 0; i < firstspace; i++)              {  pixels[2] += (Buf[i] - 48)*pow(10,firstspace-1-i);   }
        for(int i = firstspace+1; i < secondspace; i++)  {  pixels[1] += (Buf[i] - 48)*pow(10,secondspace-1-i);   }
        for(int i = secondspace+1; i < thirdspace; i++)  {  pixels[0] += (Buf[i] - 48)*pow(10,thirdspace-1-i);   }
        //抛出这个像素点
        return pixels;
    }
    
    int main(int argc, char* argv[])
    {
        //首先定义一个图像buf,并初始化为0 ,此处一定要初始化图像大小和通道数,否则迭代器无法使用
        Mat ReceiveImage = Mat::zeros(200,200,CV_8UC3);
        //声名一个窗口用于显示
        namedWindow("picture");
        //声明buf,用于缓冲入的储存单个字符
        char  ReadBuf; 
        //声明帧头判断标志位
        int flag = 0;
        //输入流重定向,将输入流定向到相应文件,定向错误则退出
        if(freopen("rgb.txt","r", stdin) == NULL )   {  fprintf(stderr,"open error"); return -1;}
        //进入循环读图模式
            while(1) 
            {    //帧头判断
                if(flag != 5)
                {  
                    cin>>ReadBuf; 
                    if(ReadBuf == '6' && flag == 0)  flag = 1;
                    else if(ReadBuf == '5' && flag == 1)  flag = 2;
                    else if(ReadBuf == '5' && flag == 2)  flag = 3;
                    else if(ReadBuf == '3' && flag == 3)  flag = 4;
                    else if(ReadBuf == '5' && flag == 4)  flag = 5; 
                    else  flag = 0;
                }else{                                    flag = 0;
                      //迭代器读图储存
                     Mat_<Vec3b>::iterator itbeg = ReceiveImage.begin<Vec3b>() ; 
                     Mat_<Vec3b>::iterator itend = ReceiveImage.end<Vec3b>()   ;
                     for( ;itbeg != itend ;itbeg++ )
                     {         *itbeg = GetPoint();   }
                     imshow("picture",ReceiveImage);
                      waitKey(0);
                }
            }
        return 0;
    }
  • 相关阅读:
    【转载】 opencv, PIL.Image的彩色图片维度 && caffe和pytorch的矩阵维度
    【转载】 Caffe BN+Scale层和Pytorch BN层的对比
    【转载】 Pytorch中的学习率调整lr_scheduler,ReduceLROnPlateau
    【转载】 Pytorch(0)降低学习率torch.optim.lr_scheduler.ReduceLROnPlateau类
    【转载】 PyTorch学习之六个学习率调整策略
    【转载】 Pytorch(1) pytorch中的BN层的注意事项
    【转载】 【caffe转向pytorch】caffe的BN层+scale层=pytorch的BN层
    硬件设计之串口收发器---ISO1050 (现行) 隔离式 5V CAN 收发器
    外盘和内盘
    工业级别sd卡存贮slc mlc tlc
  • 原文地址:https://www.cnblogs.com/YangQiaoblog/p/6102033.html
Copyright © 2011-2022 走看看