Lập trình sử dụng hàm OpenCV can bang histogram ma tran hinh trén va dislay histogram trước và sau khi cân bằng a... Nhận xét: Kết quả tính toán bằng tay và kết quả dung OpenCV là hoản t
Trang 1
DAI HOC QUOC GIA TP HO CHi MINH TRUONG DAI HOC BACH KHOA
BAI TAP 1 MON HOC: NHAP MON THI GIAC MAY TINH
HOC KY 222/ NAM HOC 2022 - 2023
LỚP: L01 - NHÓM: 3 GIANG VIEN HUONG DAN: TS LE BUC HANH
Tp Hồ Chí Minh — 2023
Trang 2
MUC LUC
Trang 3Bai 1
Giả sử vùng làm việc có kích thước như sau:
Ta có:
Vay ta chon 4 camera daA4200-30mecl (S-Mount) - Tray (40pcs) - Basler dart có:
4.6 mm x 3.4 mm Sensor Size
Trang 4Bai 2
Cho hình có ma trận sau:
a Can bang histogram bang tay ma tran trên trong khoảng từ 0 — 255 sử dụng 256 bin
b Lập trình sử dụng hàm OpenCV can bang histogram ma tran hinh trén va dislay histogram trước và sau khi cân bằng
a Theo ma tran, ta co các cường độ và pixel tương ứng
Bài làm
20 |30 |80 |I0 |110|12 | 15 | 16 | 220 | 230 | 240 | 250
0
Trang 5
HISTOGRAM
1
Gray Level
Trang 6
207.1875 223.125 239.0625
255
b Su dung Visual Studio va OpenCV
@ Code
#include “opencv2/opencv.hpp"
#include “opencv2/highgui/highgui.hpp"
#include “opencv2/imgproc/imgproc.hpp"
#include <opencv2/core/utils/logger.hpp>
#include <iostream>
#include <stdint.h>
using namespace cv;
using namespace std;
void histogram(string const& name, Mat const& Image)
{
int bin = 255;
int histsize[] = { bin };
float range[] = { 0,255 };
const float* ranges[] = { range };
Mat hist;
int chanel[] = { @ };
int hist_heigt = 256;
Trang 7Mat hist_image = Mat::zeros(hist_heigt, bin, CV_8SC3);
calcHist(&lImage, 1, chanel, Mat(), hist, 1, histsize, ranges, true, false);
double max_val = Q;
minMaxLoc (hist, 9, &max_val);
for (int i = @; i < bin; i++)
float binV = hist.at<float>(i);
int height = cvRound(binv * hist_heigt / max_val);
line(hist_image, Point(i, hist_heigt - height), Point(i, hist_heigt), Scalar::a11(255));
}
imshow(name, hist_image);
}
int main(int argc, char const* argv[])
{
cv: :utils: : logging: :setLogLevel(utils: : logging: :LOG_LEVEL_SILENT);
float data[16] = { 30, 20, 30, 30, 80, 30, 100, 110, 120, 160, 30,
150, 220, 230, 240, 250 };
Mat gray_anh = Mat(4, 4, CV_32F, data);
Mat gray_his;
namedWindow("Gray_old", WINDOW_FREERATIO);
gray_anh.convertTo(gray_anh, CV_8UC1);
equalizeHist(gray_anh, gray_his);
cout << “Matrix = " << endl <<
cout << “Matrix_histogram = "
<< endl;
imshow("Gray_old", gray_anh);
imshow("Gray_new_histogram", gray_his);
histogram("Histogram Old", gray_anh);
histogram("Histogram New", gray_his);
waitKkey(@);
return 0;
<< gray_anh << endl << endl;
<< endl << "" << gray_his << endl
@® Két quả thụ được
Trang 8
Nhận xét: Kết quả tính toán bằng tay và kết quả dung OpenCV là hoản toàn giống nhau
Bài 3
a+b
Code:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
// Ham mouseEvent de tim mau H, S, V cua canh tay de phan nguong
Trang 9void mouseEvent(int evt, int x, int y, int flags, void * param)
{
Mat * bgr = (Mat *) param;
Mat hsv;
cvtColor(*bgr, hsv, COLOR _BGR2HSV);
if (evt == EVENT _LBUTTONDOWN)
{
printf("(%d,%d): %d %d %d\n", x, y, (int)(hsv).at<Vec3b>(y,x)[9],
(int) (hsv).at<Vec3b>(y,x)[1], (int) (hsv) at<Vec3b>(y, x)[2]);
}
int main(int argc, char** argv)
{
// Load 2 anh vao va resize cho cung kich thuoc
Mat background_image = imread("D:/HK222/TGMT/BAITAP1/background png",
IMREAD_COLOR);
Mat hand_image = imread("D:/HK222/TGMT/BAITAP1/hand png", IMREAD COLOR); resize(background image, background_image, Size(600, 40@));
resize(hand_image, hand_image, Size(600, 400));
// a) Tinh khoang cach Euclide giua 2 mau
Mat diff_image;
absdiff(hand_image, background_image, diff_image);
Float d;
float t = 0.9;
for(int i = 0; i < diff_image.rows; i++)
{
for(int j = 9; j < diff image.cols; j++)
Trang 10Vec3b p = diff_image.at<Vec3b>(i,j);
d = sqrt(p[9]*p[9] + p[1]?#p[1] + p[2]#p[2])›
// if (d > t)
/f final_image.at<unsigned char>(i,j) = 255; // else
// final_image.at<unsigned char>(1,j) = 9;
// Show 2 anh input
namedWindow("Back Ground Image", WINDOW _AUTOSIZE); imshow("Back Ground Image", background_image) ;
namedWindow( "Hand Image", WINDOW _AUTOSIZE);
imshow("Hand Image", hand_image);
setMouseCallback("Hand Image", mouseEvent, &hand_image);
// Tao cac thanh slider de tim nguong
namedWindow("Control", WINDOW AUTOSIZE);
createTrackbar("“Low H", "Control", nullptr, 179); createTrackbar("High H", “Control”, nullptr, 179); createTrackbar("“Low S", "Control", nullptr, 255); createTrackbar("High S", “Control”, nullptr, 255); createTrackbar("“Low V", "Control", nullptr, 255); createTrackbar("High V", “Control”, nullptr, 255);
int lowH, highH, lowS, highS, lowV, highv;
// Phan nguong HSV
while(1)
{
Trang 11highV),
Mat final_image = imread("D:/HK222/TGMT/BAITAP1/hand.png", IMREAD COLOR); resize(final_image, final_image, Size(600, 400));
cvtColor(final_image, final image, COLOR _BGR2HSV);
lowH = getTrackbarPos("Low H", “Control");
highH = getTrackbarPos("High H", “Control");
lowS = getTrackbarPos("Low S", "“Control");
highS = getTrackbarPos("High S", “Control");
lowV = getTrackbarPos("Low V", “Control");
highV = getTrackbarPos("High V", “Control");
// Threshold the image
inRange(final_image, Scalar(lowH, lowS, lowV), Scalar(highH, highs, final image); // (9, 141, 76) - (255, 255, 255)
namedWindow("Final Image", WINDOW _AUTOSIZE);
imshow("Final Image", final_image) ;
if (waitKey(1) == ‘q')
{
break;
}
}
return 0;
Két qua:
Trang 12
Bài 4
Cho hình có ma trận sau:
STT+1 16 17 18 19 STT-1 21
Trang 13
- Nhóm | nén STT=3 ta co ma tran:
Chon:
* Chia dữ liệu thành 2 phần theo
- Nhỏ hơn
- Lớn hơn
* Chia dữ liệu thành 2 phần theo
Trang 14- Nhỏ hơn
- Lớn hơn
* Chia dữ liệu thành 2 phần theo
- Nhỏ hơn
- Lớn hơn
* Ta có
Vậy giá trị Otsu Threshold =
Ma trận sau khi phân ngưỡng:
255 255 0 255 255 255 255
Trang 15
255 255 255 255 255 255 255
b Su dung Visual Studio va OpenCV
Code:
b) Su dung ham :
Source Code:
#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace cv;
using namespace std;
int main()
{
int STT;
cout << “Read the Group_ID: ";
cin >> STT;
Mat source = (Mat_<uint8 t>(6,7)<<1,2,S51T,4,5,6,7,
8 ,9, 10, 11, STT, 13,14, (STT+1),16 ,17 ,18 ,19 ,(STT-1), 21,
22, 23, STT, 25, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, (STT+1),42);
Mat dst;
double minValue = 9;
double maxValue = 255;
long double otsu_thre = threshold(source,dst,minValue,maxValue, THRESH_OTSU) ; cout << “Otsu Thresh : ” << otsu_thre<<endl;
cout <<”OUTPUT” <<dst<<endl;
return 0;
}
Kết quả :
Trang 165 $ /BT4 Read the G 5} H
su Thresh
Sa
6,
*Nhdan xét Gia tri Threshold ding phương pháp Ostu ca tinh tay va function của thư viện openCV cho ra cung ket qua