通过串口+OpenCv 的智能车图像还原


做过智能车摄像头的都知道,我们在做车的过程中如果光是看那些单片机传回来的01字符串的图像数据的话,那可是一件相关无聊的事情。不仅如此,看这样的数据还很废眼睛的。这样的话看没过多眼睛就开始累了,就开始不想干活了。

 
     我也正是因为这样,看着这些超级无聊的数据时。感觉怎么看就怎么无聊,然后就开始找人聊天去了。可是没办法呀,人家要做作业呀。我跟人家说想和她聊聊 天,人家却说你怎么就那么无聊啊。…………唉!!!!然后,然后就没敢再找她聊天,不管是有多无聊也不敢了。也许,这个感情这东西也就是这样子吧,我也不 知道是为什么了,明明是喜欢人家嘛,却又没勇气说出来,又是害怕人家不接受。明明是想找人家聊聊天嘛,却又怕人家说自己是个超级无聊人士。我也时常的在劝 自己啦,竟然喜欢人家嘛,就要勇敢去追呀,再不追的话就没戏了呀。再不追的话,好不容易才找到的心仪女孩子就没了呀,你以为这样了女孩子是那么容易找的 嘛。
       唉!!!!这些东西自己都知道的啦,我也总是在劝我自己要勇敢一点啦,竟然喜欢人家就大胆地跟人家说出来呀什么什么滴。可是每每当话到嘴边的时候却100%的就这样子给卡了说不出了,你说我这是怎么啦呀。悲剧啊我。。你说我到底该怎么才能让她给接受我呢??
       唉!!!!说了那么多了,也该进入正题了,这个程序也就是在这种超级无聊的时候给写下来的。要不然的话我还真的有跳楼的想法呢。嘿嘿。。。谁让我这么无聊呢。
       关于这个程序,是利用串口将PC机和单片机连接起来。单片机将摄像头采集到的的数据直接通过串口发送到PC机端,PC机就捕捉串口传回来的数据利用OpenCv图像处理的一些简单的技术将图像给还原出来。
        在操作的过程中,首先是用OpenCv创建一个图像结构的一个对象,这个图像的对象的像素的高度和宽度要和单片机的一致,要不然的话是没法正确的还原图像 的。然后就是串口的操作了,在程序中捕捉串口发送过来的数据,将这些数据依次存放到图像的对应的像素点中。在完成一张图片的传输之后就将图片经过一定的纯 属变换,再把变换出来的目标图像给显示出来。然后,然后,然后……然后就没有然后了,就这样图像的还原也就完成了。
        唉呀,这个……这个……什么的具体的过程能说的也就说的这么清楚了。兄弟我的语言能力也就这样了,在这个日志里面如果有什么错别字的什么的,也不用提醒了啊。别笑兄弟我也就万岁了。呃…………那个如果她能够看到的话,能理解的话是最好不过的了。
        呃……呃…………也就是这么一个状况了,直接附上还原的图像和原代码。(这图片是经过放大了5倍的图片,原始图像是145 * 48的)。
        先来几张图片:

 

 

 

 

        

然后再附上原代码:

 

 

#include <iostream>

#include <windows.h>

#include <winbase.h>

#include <conio.h>

#include <cstdio>

#include <cstdlib>

#include <cv.h>

#include <highgui.h>

#include <cvaux.h>

#include <cxcore.h>

 

using namespace std;

 

HANDLE hComDev;

OVERLAPPED m_ov;

COMSTAT comstat;

DWORD m_dwCommEvents;

bool bRead = true;

bool bResult = true;

DWORD dwError = 0;

DWORD bytesRead = 0;

 

 

/**打开串口设备**/

bool openPort(char *portname);

/**设置串口设备DCB参数**/

bool setupDcb(int rate_arg);

/**设置串口设备超时限制参数**/

bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,

                  DWORD ReadTotalconstant,DWORD WriteTotalMultiplier,

                  DWORD WriteTotalconstant);

/**串口收发数据**/

void ReceiveChar(unsigned char *RXBuffer);

bool WriteChar(char* m_szWriteBuffer,DWORD m_nToSend);

void createImage(void);

 

 

int main(int argc,char**argv)

{

    bool openFlag = false;

    openFlag = openPort((char*)"COM5");

    if(openFlag)

    {

        printf("打开串口成功!\n");

        if(setupDcb(115200))

        {

            printf("波特率设置成功\n");

        }

        if(setuptimeout(0, 0, 0, 0, 0))

        {

            printf("超时限制设置成功\n");

            SetCommMask(hComDev,EV_RXCHAR);//当有字符在 inbuf 中时产生这个事件

            //清除串口的所有操作

            PurgeComm(hComDev,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);

            //WriteChar((char*)"please send data now",20);

            printf("received data:\n");

            createImage();

            CloseHandle(hComDev);

        }

    }

    return 0;

}

 

/**打开串口设备**/

bool openPort(char *portname)

{

    hComDev = CreateFile(portname, //串口号

                         GENERIC_READ|GENERIC_WRITE,//允许读写

                         0,//通讯设备以独占方式打开

                         0,//无安全属性

                         OPEN_EXISTING,//通讯设备已存在

                         FILE_FLAG_OVERLAPPED,//异步I/O

                         0);//通讯设备不能用模板打开

    if(hComDev == INVALID_HANDLE_VALUE)

    {

        CloseHandle(hComDev);

        printf("打开串口失败!\n");

        return false;

    }

    else

    {

        return true;

    }

}

bool setupDcb(int rate_arg)

{

    DCB dcb;

    //int rate = rate_arg;

    memset(&dcb, 0, sizeof(dcb));

    if(!GetCommState(hComDev, &dcb))

    {

        return false;

    }

    else

    {

        // set DCB to configure the serial port

        //波特率为115200,无奇偶校验,8位数据位,1位停止位

        //BuildCommDCB("115200,N,8,1",&dcb);

 

        dcb.DCBlength = sizeof(dcb);

        // ---------- Serial Port Config -------

        dcb.BaudRate       = rate_arg;//波特率

        dcb.Parity     = NOPARITY;//奇偶校验

        dcb.fParity    = 0;

        dcb.StopBits       = ONESTOPBIT;//1位停止位

        dcb.ByteSize       = 8;//8位数据位

        dcb.fOutxCtsFlow   = 0;

        dcb.fOutxDsrFlow   = 0;

        dcb.fDtrControl    = DTR_CONTROL_DISABLE;

        dcb.fDsrSensitivity = 0;

        dcb.fRtsControl    = RTS_CONTROL_DISABLE;

        dcb.fOutX          = 0;

        dcb.fInX           = 0;

        //---------- misc parameters -----

        dcb.fErrorChar     = 0;

        dcb.fBinary        = 1;

        dcb.fNull          = 0;

        dcb.fAbortOnError  = 0;

        dcb.wReserved      = 0;

        dcb.XonLim         = 2;

        dcb.XoffLim        = 4;

        dcb.XonChar        = 0x11;

        dcb.XoffChar       = 0x13;

        dcb.EvtChar        = 0;

 

        // set DCB

        if(!SetCommState(hComDev,&dcb))

        {

            return false;

        }

        else

        {

            return true;

        }

    }

}

bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD

                  ReadTotalconstant,DWORD WriteTotalMultiplier,

                  DWORD WriteTotalconstant)

{

    COMMTIMEOUTS timeouts;

    timeouts.ReadIntervalTimeout=ReadInterval;

    timeouts.ReadTotalTimeoutConstant=ReadTotalconstant;

    timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier;

    timeouts.WriteTotalTimeoutConstant=WriteTotalconstant;

    timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier;

    if(!SetCommTimeouts(hComDev, &timeouts))

        return false;

    else

        return true;

}

void ReceiveChar( unsigned char *RXBuffer)

{

    if(bRead)

    {

        bResult = ReadFile(hComDev,//Handle to Comm port

                           RXBuffer,//RX Buffer Pointer

                           1,       //Read one byte

                           &bytesRead,//Stores number of bytes read

                           &m_ov);  //pointer to the m_ov structure

 

        if(!bResult)

        {

            switch(dwError = GetLastError())

            {

            case ERROR_IO_PENDING:

            {

                bRead = false;

                break;

            }

            default:

            {

                break;

            }

            }

        }

        else

        {

            bRead = true;

        }

    }

    if(!bRead)

    {

        bRead = true;

        bResult = GetOverlappedResult(hComDev,//Handle to Comm port

                                      &m_ov,//Overlapped structure

                                      &bytesRead,//Stores number of bytes read

                                      true);// Wait flag

    }

}

void createImage(void)

{

    IplImage *src = NULL;

    IplImage *dst = NULL;

    int height,width,step,channels;

    int i,j,k;

    unsigned char *imgdata = NULL;

    unsigned char data;

    src =  cvCreateImage(cvSize(145,48),IPL_DEPTH_8U, 1);

    dst =  cvCreateImage(cvSize(145 * 5,48 * 5),IPL_DEPTH_8U, 1);

    height    = src->height;

    width     = src->width;

    step      = src->widthStep;

    channels  = src->nChannels;

    imgdata  = (unsigned char *)src->imageData;

 

    bRead = true;

    bResult = true;

    dwError = 0;

    bytesRead = 0;

    for(;;)

    {

        bResult = ClearCommError(hComDev,&dwError, &comstat);

        if (comstat.cbInQue == 0)

        {

            continue;

        }

 

        for(i=0; i<height; i++)

        {

            for(j=0; j<width; j++)

            {

                for(k=0; k<channels; k++)

                {

                    ReceiveChar(&data);

                    if(data == '1')

                    {

                        imgdata[i*step+j*channels+k]=255;

                    }

                    else

                    {

                        imgdata[i*step+j*channels+k]=0;

                    }

                }

            }

        }

        cvResize(src, dst, CV_INTER_LINEAR);

 

        cvNamedWindow("src", CV_WINDOW_AUTOSIZE);

        cvShowImage("src", dst);

 

        if(cvWaitKey(1) == 27)

        {

            cvDestroyWindow ("src");

            cvReleaseImage(&src);

            cvReleaseImage(&dst);

            return;

        }

 

    }

}

bool WriteChar(char* m_szWriteBuffer,DWORD m_nToSend)

{

    BOOL bWrite = TRUE;

    BOOL bResult = TRUE;

    DWORD BytesSent = 0;

    //HANDLE m_hWriteEvent;

    //ResetEvent(m_hWriteEvent);

 

    if (bWrite)

    {

        m_ov.Offset = 0;

        m_ov.OffsetHigh = 0;

        // Clear buffer

        bResult = WriteFile(hComDev, // Handle to COMM Port

                            m_szWriteBuffer, // Pointer to message buffer in calling finction

                            m_nToSend,      // Length of message to send

                            &BytesSent,     // Where to store the number of bytes sent

                            &m_ov );        // Overlapped structure

        if (!bResult)

        {

            DWORD dwError = GetLastError();

            switch (dwError)

            {

            case ERROR_IO_PENDING:

            {

                // continue to GetOverlappedResults()

                BytesSent = 0;

                bWrite = FALSE;

                break;

            }

            default:

            {

                // all other error codes

                break;

            }

            }

        }

    } // end if(bWrite)

    if (!bWrite)

    {

        bWrite = TRUE;

        bResult = GetOverlappedResult(hComDev,   // Handle to COMM port

                                      &m_ov,     // Overlapped structure

                                      &BytesSent,    // Stores number of bytes sent

                                      TRUE);         // Wait flag

 

        // deal with the error code

        if (!bResult)

        {

            printf("GetOverlappedResults() in WriteFile()");

        }

    } // end if (!bWrite)

    // Verify that the data size send equals what we tried to send

    if (BytesSent != m_nToSend)

    {

        printf("WARNING: WriteFile() error.. Bytes Sent: %d; Message Length: %d\n",

               (int)BytesSent, (int)strlen((char*)m_szWriteBuffer));

    }

    return true;

}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM