通過串口+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