事件篩選 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