事件篩選 EventFilter

qApp->installEventFilter(this);

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    QString str;
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
    QPoint pt = mouseEvent->pos();

    unsigned int x, y;
    unsigned char r, g, b;
    x = pt.x()/scaleFactor;
    y = pt.y()/scaleFactor;
    switch(event->type())
    {
        case QEvent::MouseMove:
            mouseEvent = static_cast<QMouseEvent*>(event);
        // 判斷停留在視窗1或是視窗2
        switch(ui->tabWidget->currentIndex())
        {
        case 0:
            str = "視窗1, 解析:" + QString::number(img_rgb1.cols) + "x" + QString::number(img_rgb1.rows)
                 +", 座標:(" + QString::number(x) + ", "+ QString::number(y) + ")";
            getPixel(img_rgb1, y, x, &r, &g, &b);
            str += ", RGB = (" + QString::number(r) + "," + QString::number(g) + "," + QString::number(b) + ")";
            break;
        case 1:
            str = "視窗2, 解析:" + QString::number(img_rgb2.cols) + "x" + QString::number(img_rgb2.rows)
                 +", 座標:(" + QString::number(x) + ", "+ QString::number(y) + ")";
            getPixel(img_rgb2, y, x, &r, &g, &b);
            str += ", RGB = (" + QString::number(r) + "," + QString::number(g) + "," + QString::number(b) + ")";
            break;
        }
        if(img_rgb1.cols > 0 | img_rgb2.cols)
        ui->statusBar->showMessage(str);
        break;
    case QEvent::MouseButtonPress:
        str = "MouseButtonPress(" + QString::number(x) +", " + QString::number(y) + ")";
        ui->statusBar->showMessage(str);                           // 顯示座標
        break;
    case QEvent::MouseButtonRelease:
        str = "MouseButtonRelease(" + QString::number(x) +", " + QString::number(y) + ")";
        ui->statusBar->showMessage(str);                           // 顯示座標
        break;
    }
    return false;
}

-----------------------------------------------------------------------------------------------------------

滑鼠移動時,自動抓取滑鼠位置對應的像素值(圖的下方Statusbar)

 

產生棋盤格createChessboard.m

img = zeros(500, 500,'uint8');
siz = 100;
cnt = 0;
cols = 12;
rows = 6;
for i=1:rows
    for j=1:cols
        cnt = cnt +1;
        if(mod(i,2)==0)
            if mod(cnt,2)==0
                icolor = 255;
            else
                icolor = 0;
            end
        else
            if mod(cnt,2)==0
                icolor = 0;
            else
                icolor = 255;
            end            
        end
        img( (i-1)*siz+1:i*siz, (j-1)*siz+1:j*siz) = icolor;
    end
end
imshow(img);
cnt = 0;
for i=1:cols
    for j=1:rows
        cnt = cnt +1;
        text( i*siz-siz/2, j*siz-siz/2, num2str(cnt), 'fontsize', 14, 'color', [1 0 0]);
    end
end
f = getframe(gca);
imwrite(f.cdata, 'chessboard_num.jpg');
imwrite(img, 'chessboard.jpg');

另一張加上編號

---------------------------------------------------------------------------------

以下解決滑鼠移動時,僅能顯示原始影像的像素值而無法顯示影像處理後的向素值的問題.

會讀入影像至img_rgb1, 同時複製一份給img_rgb1

mainwindow.cpp

跳到 void MainWindow::actionaAddRGBNoise(int index)副程式

//彩色雜訊

 
 

 若要恢復原始影像呢?

 轉灰階

輸入關鍵字rgb2gray

跳到信號槽

跳至副程式actionRGB2Gray

 

-------------------------------------------------------------------------------------------------------

仿照上面步驟修改

actionExtractR(), actionExtractG(), actionExtractB()

 

----------------------------------------------------------------------------------------------------------------------

 以上新增兩個影像備份的方法, 可以以最小修改幅度讓原本程式架構不變下, 達到每次進行不同影像處理後可以滑鼠移動去觀看每一點的像素值,

並且可以隨時儲存某一個影像處理後的結果影像, 或輕易地恢復至原始未處理的影像狀態

操作展示: 2013 11 09 MouseEventAppQt5OpenCV246

範例程式(source code): MouseEventAppQt5OpenCV246

 ---------------------------------------------------------------------------------------------------------------------

加入<影像ROI>

設定<影像ROI>的屬性, 記得將checkable打勾

新增一個頁面<ROI影像>

切換至<ROI影像>頁面, 加入一個元件:Label, 用來顯示影像

開啟mainwindow.cpp

跳到副程式eventFilter

MouseMove

 MouseButtonPress

 MouseButtonRelease


其中copyImageROI實作如下, 在ImageUtility.cpp可以找到
//複製感興趣區域影像
void copyImageROI(cv::Mat &src,cv::Mat &dst, cv::Rect &rect)
{
     dst=src(rect).clone();
}
 
操作展示: 2013 11 11 MouseMoveAppQt5OpenCV246 v2

 範例程式(source code): MouseEventAppQt5OpenCV246_2
-----------------------------------------------------------------------------------------------------------------------------------
儲存感興趣區域照片

操作展示: 2013 11 11 MouseMoveAppQt5OpenCV246 v3

範例程式(source code): MouseEventAppQt5OpenCV246_v3
文章標籤
OpenCV Qt Image Processing
全站熱搜
創作者介紹
創作者 me1237guy 的頭像
me1237guy

天天向上

me1237guy 發表在 痞客邦 留言(0) 人氣()