Professional Documents
Culture Documents
Phần 1. Đặt Vấn Đề: 2.1. Lựa Chọn Ngôn Ngữ Lập Trình
Phần 1. Đặt Vấn Đề: 2.1. Lựa Chọn Ngôn Ngữ Lập Trình
ĐẶT VẤN ĐỀ
Ứng dụng công nghệ xử lý ảnh để phân loại sản phẩm theo hình dạng có những chức
năng như sau:
- Chức năng nhận diện hình dạng sản phẩm cơ bản như hình tròn, hình vuông, hình chữ
nhật, hình tam giác
- Lưu được thông tin vào cơ sở dữ liệu
2
MySQL Workbench là một công cụ truy cập cơ sở dữ liệu được mô hình hóa và thiết
kế trực quan sử dụng cho cơ sở dữ liệu quan hệ MySQL server. MySQL Workbench giúp tạo
ra các mô hình dữ liệu vật lý mới và hỗ trợ sửa đổi các cơ sở dữ liệu MySQL hiện có với các
kỹ thuật đảo ngược / chuyển tiếp, các chức năng quản lý tùy chọn.
3
3.1.1. Nếu sử dụng hình ảnh
Kết thúc
Ngắt k ết nối
cơ sở dữ liệu, Kết thúc
camera
4
Bắt đầu Tạo ảnh xám Tạo bộ nhỡ và làm
rỗng bộ nhớ
Lọc điều kiện, vẽ viền đường tròn ra màn hình, Phát hiện hình tròn
lưu thông tin vào cơ sở dữ liệu
Lọc điều kiện xác định hình dạng, vẽ cạnh ra Tìm số cạnh của
màn hình, lưu thông tin vào cơ s ở dữ liệu hình
5
Hình 9. Cửa sổ Property
- Bước 2: Ấn Linker > Input > Additional Dependencies > Edit > copy đường dẫn…\
opencv\build\x64\vc12\lib\*.lib
6
Hình 11. Thư mục file .dll
- Bước 4: vào file chứa project đã tạo paste toàn bộ file .dll vừa copy ở trên vào vị trí
như đường dẫn …\Project1\x64\Debug
7
4.2. CHƯƠNG TRÌNH
```C++
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/imgproc/imgproc_c.h"
#include <iostream>
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <cppconn/statement.h>
#include <cppconn/exception.h>
void connectToMySQL() {
try {
driver = sql::mysql::get_mysql_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root","30102003");
con->setSchema("btlxla"); if (con){
cout << "Connected to MySQL successfully!" << endl;
} Else { cout << "Failed to connect to
MySQL." << endl;
}
}
catch (sql::SQLException& e) {
cout << "SQLException: " << e.what() << endl;
cout << "SQLState: " << e.getSQLState() << endl;
cout << "ErrorCode: " << e.getErrorCode() << endl;
}
}
void insertDataIntoTable(sql::Connection* con, const string&
hinhdang, const string& thongtin) { try {
sql::Statement* stmt = con->createStatement();
string query = "INSERT INTO hinh (hinh_dang, thong_tin) "
"VALUES ('" + hinhdang + "', '" + thongtin + "')"; stmt-
>executeUpdate(query); cout << "du lieu cap nhap thanh
cong" << endl;
delete stmt;
}
catch (sql::SQLException& e) {
cout << "Lỗi SQL: " << e.what() << endl;
} }
void disconnectFromMySQL() {
if (con) { delete
con;
cout << "Disconnected from MySQL server." << endl;
}
}
8
void Circles(IplImage* frame) {
IplImage* gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
cvCvtColor(frame, gray, CV_BGR2GRAY);
cvSmooth(gray, gray, CV_GAUSSIAN, 9, 9, 2, 2);
// Detect Circles
//CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1,
gray->height / 8, 100, 30, 10, 90);
CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1,
gray->height / 8, 100, 30, 70, 90);// neu dung cammera
// Draw Circles
for (int i = 0; i < circles->total; i++) {
float* p = (float*)cvGetSeqElem(circles, i);
CvPoint center = cvPoint(cvRound(p[0]), cvRound(p[1]));
int radius = cvRound(p[2]);
9
// Lọc các đỉnh theo số đỉnh và diện tích
double area = fabs(cvContourArea(approx, CV_WHOLE_SEQ));
CvRect rect = cvBoundingRect(contour);
if (approx->total == 3 && area > 500)
{ // Vẽ đường contour lên ảnh gốc
cvDrawContours(img, approx, CV_RGB(255, 0, 0), CV_RGB(255, 0,
0), 0, 2);
cout << "Hinh tam giac tai toa do (" << rect.x << " " <<
rect.y << ")" << endl; CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.0, 1.0, 0, 1, 8);
cvPutText(img, "Tam giac", cvPoint(rect.x, rect.y - 1), &font, CV_RGB(0,
69, 255));
string thongtin = "vi_tri_(" + to_string(rect.x) + "," +
to_string(rect.y) + ")";
insertDataIntoTable(con, "hinh_tam_giac", thongtin);
}
else if (approx->total == 4 && area > 1000) {
// Kiểm tra xem có phải là hình vuông hay hình chữ nhật
double ratio = (double)rect.width / (double)rect.height; if
(ratio > 0.8 && ratio < 1.2) {
// Vẽ đường contour lên ảnh gốc
cvDrawContours(img, approx, CV_RGB(0, 255, 0), CV_RGB(0,
255, 0), 0, 2);
cout << "Hinh vuong tai toa do (" << rect.x << " " <<
rect.y << ")" << " voi chieu rong " << rect.width << " va chieu cao " <<
rect.height << endl;
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.0, 1.0, 0, 1,
8); cvPutText(img, "Hinh vuong", cvPoint(rect.x, rect.y -
1),
&font, CV_RGB(0, 69, 255));
string thongtin = "vi_tri_(" + to_string(rect.x) + "," +
to_string(rect.y) + ")_rong_"+ to_string(rect.width) + "_cao_" +
to_string(rect.height); insertDataIntoTable(con,
"hinh_vuong", thongtin);
}
else {
// Vẽ đường contour lên ảnh gốc
cvDrawContours(img, approx, CV_RGB(0, 0, 255), CV_RGB(0,
0, 255), 0, 2);
cout << "Hinh chu nhat tai toa do (" << rect.x << " " <<
rect.y << ")" << " voi chieu rong " << rect.width << " va chieu cao " <<
rect.height << endl;
CvFont font;
cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.0, 1.0, 0, 1,
8); cvPutText(img, "Hinh chu nhat", cvPoint(rect.x,
rect.y -
1), &font, CV_RGB(0, 69, 255));
string thongtin = "vi_tri_(" + to_string(rect.x) + "," +
to_string(rect.y) + ")_rong_" + to_string(rect.width) + "_cao_" +
to_string(rect.height); insertDataIntoTable(con,
"hinh_chu_nhat", thongtin);
}
}
}
cvReleaseImage(&imgGray);
cvReleaseImage(&imgCanny);
}
10
int main() {
// Thay đổi đoạn mã để đọc ảnh từ tệp tin
connectToMySQL();
const char* filename = "C:\\Users\\mayti\\Downloads\\hinh.png"; //
Đặt đường dẫn tới ảnh của bạn
IplImage* frame = cvLoadImage(filename);
if (!frame) {
cerr << "Cannot open image file!" << endl;
return -1;
}
cvNamedWindow("Product Classification", CV_WINDOW_AUTOSIZE);
// Gọi các hàm xử lý trên ảnh
Circles(frame); detectShapes(frame);
cvReleaseImage(&frame);
cvDestroyAllWindows(); disconnectFromMySQL();
return 0;
11
// nếu sử dụng camera thì dùng hàm main này
/* int
main() {
connectToMySQL();
CvCapture* capture = cvCaptureFromCAM(0);
if (!capture) {
cerr << "Cannot open camera!" << endl;
return -1;
}
cvNamedWindow("Product Classification", CV_WINDOW_AUTOSIZE);
while (true) {
cvWaitKey(5000);
IplImage* frame = cvQueryFrame(capture);
if (!frame) {
cerr << "Cannot read frame from camera!" << endl;
break;
}
Circles(frame);
detectShapes(frame);
return 0;
}
*/
12
Hình 12. Kết quả nếu sử dụng hình ảnh
5.1.2. Kết quả nếu sử dụng camera
Hình 13. Kết quả nếu sử dụng camera nhận biết hình tròn
13
Hình 14. Kết quả nếu sử dụng camera nhận biết hình chữ nhật
Hình 15. Kết quả nếu sử dụng camera nhận biết hình vuông
14
Hình 16. Kết quả nếu sử dụng camera nhận biết hình tam giác
15
5.2. VẤN ĐỀ CẦN GIẢI QUYẾT
- Chưa có khả năng nhận diện hình khó như hình thoi, hình bình hành….
- Chưa tạo được giao diện than thiên với người dùng.
- Khả năng chính xác khi sử dụng camera không phải là tuyệt đối co thể bắt nhầm vật ta
không mong muốn.
- Các thuật toán sử dụng có những sai số nhất định so với thực tế.
- Khi sử dụng hình ảnh một số hình ảnh quá bé sẽ khó xác định.
16