Skip to content
Snippets Groups Projects
Commit 66556522 authored by 서의수's avatar 서의수
Browse files

Merge branch 'camera' into 'main'

Update Directory Structure, Add Camera Code

See merge request !3
parents efc5afab 08277116
No related branches found
No related tags found
1 merge request!3Update Directory Structure, Add Camera Code
File moved
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>
#define BUF_SIZE 1024
int serv_sock, clnt_sock, lcd_sock;
int is_car;
void error_handling(char *message){
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
void *wait_client(void* data){
char* port = (char*)data;
clnt_sock = -1;
struct sockaddr_in serv_addr;
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
if (serv_sock == -1)
error_handling("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(port));
if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
error_handling("bind() error");
int clnt_addr;
socklen_t clnt_addr_size;
printf("[*] wait for client ...\n");
if (listen(serv_sock, 5) == -1)
error_handling("listen() error");
if (clnt_sock < 0) {
clnt_addr_size = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if (clnt_sock == -1)
error_handling("accept() error");
else
printf("[*] client connected\n");
}
}
void *connect_server(void * data){
char* addr = ((char**)data)[0];
char* port = ((char**)data)[1];
struct sockaddr_in serv_addr;
lcd_sock = socket(PF_INET, SOCK_STREAM, 0);
if (lcd_sock == -1)
error_handling("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(addr);
serv_addr.sin_port = htons(atoi(port));
printf("%s %s\n", addr, port);
if (connect(lcd_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
error_handling("connect() error");
else
printf("server connect \n");
}
void *read_person(){
char buf[2];
while(1){
if(read(clnt_sock, buf, sizeof(buf)) > 0){
system("raspistill -o /home/uisoo/Desktop/project/Res/input.JPG.jpg");
system("/home/uisoo/Desktop/opencv");
FILE* fp;
fp = fopen("/home/uisoo/Desktop/project/output.JPG", "r");
char *tmp;
fread(tmp, sizeof(char), 1024, fp);
fclose(fp);
printf("%s\n", buf);
if(strcmp(buf, "1") == 0){
is_car = 1;
write(lcd_sock, tmp, sizeof(tmp));
}else{
write(lcd_sock, "empty", sizeof(tmp));
}
}
}
}
int main(int argc, char* argv[]) {
if (argc != 4) {
printf("Usage : %s <sensor port>, <ip> <port> \n", argv[0]);
}
// Wait Client (Sensor)
pthread_t wait_client_t, connect_lcd_t;
int status;
if(pthread_create(&wait_client_t, NULL, wait_client, (void*)argv[1]) < 0){
perror("thread create error: ");
exit(0);
}
char* serv_info[2] = {argv[2], argv[3]};
// Connect to LCD
if(pthread_create(&connect_lcd_t, NULL, connect_server, (void*)serv_info) < 0){
perror("thread create error: ");
exit(0);
}
pthread_join(wait_client_t, (void **)&status);
pthread_join(connect_lcd_t, (void **)&status);
pthread_t read_t;
if(pthread_create(&read_t, NULL, read_person, NULL) < 0){
perror("thread create error: ");
exit(0);
}
while(1){
sleep(1);
}
// while(1)
// {
// system("raspistil -o Image.JPG");
// system("");
// if(pthread_create(&file_read_t, NULL, file_read, NULL) < 0){
// perror("thread create error: ");
// exit(0);
// }
// pthread_join(file_read_t, (void **)&status);
// if(pthread_create(&file_exec_t, NULL, file_exec, NULL) < 0){
// perror("thread create error: ");
// exit(0);
// }
// pthread_join(file_exec_t, (void **)&status);
// }
close(serv_sock);
return 0;
}
#include <vector>
#include <iostream>
#include <leptonica/allheaders.h>
#include <regex>
#include <fstream>
#include <wtypes.h>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <tesseract/baseapi.h>
using namespace cv;
DWORD convert_unicode_to_ansi_string(__out std::string& ansi, __in const wchar_t* unicode, __in const size_t unicode_size);
DWORD convert_utf8_to_unicode_string(__out std::wstring& unicode, __in const char* utf8, __in const size_t utf8_size);
struct myclass {
bool operator() (Rect r1, Rect r2) { return (r1.x < r2.x); }
} myobject;
std::string utf8_to_string(const char *utf8str)
{
std::wstring unicode = L"";
std::string ansi = "";
convert_utf8_to_unicode_string(unicode, utf8str, std::strlen(utf8str));
convert_unicode_to_ansi_string(ansi, unicode.c_str(), unicode.size());
return ansi;
}
DWORD convert_unicode_to_ansi_string(__out std::string& ansi, __in const wchar_t* unicode, __in const size_t unicode_size) {
DWORD error = 0;
do {
if ((nullptr == unicode) || (0 == unicode_size)) {
error = ERROR_INVALID_PARAMETER;
break;
}
ansi.clear();
//
// getting required cch.
//
int required_cch = ::WideCharToMultiByte(
CP_ACP,
0,
unicode, static_cast<int>(unicode_size),
nullptr, 0,
nullptr, nullptr
);
if (0 == required_cch) {
error = ::GetLastError();
break;
}
//
// allocate.
//
ansi.resize(required_cch);
//
// convert.
//
if (0 == ::WideCharToMultiByte(
CP_ACP,
0,
unicode, static_cast<int>(unicode_size),
const_cast<char*>(ansi.c_str()), static_cast<int>(ansi.size()),
nullptr, nullptr
)) {
error = ::GetLastError();
break;
}
} while (false);
return error;
}
DWORD convert_utf8_to_unicode_string(__out std::wstring& unicode, __in const char* utf8, __in const size_t utf8_size) {
DWORD error = 0;
do {
if ((nullptr == utf8) || (0 == utf8_size)) {
error = ERROR_INVALID_PARAMETER;
break;
}
unicode.clear();
//
// getting required cch.
//
int required_cch = ::MultiByteToWideChar(
CP_UTF8,
MB_ERR_INVALID_CHARS,
utf8, static_cast<int>(utf8_size),
nullptr, 0
);
if (0 == required_cch) {
error = ::GetLastError();
break;
}
//
// allocate.
//
unicode.resize(required_cch);
//
// convert.
//
if (0 == ::MultiByteToWideChar(
CP_UTF8,
MB_ERR_INVALID_CHARS,
utf8, static_cast<int>(utf8_size),
const_cast<wchar_t*>(unicode.c_str()), static_cast<int>(unicode.size())
)) {
error = ::GetLastError();
break;
}
} while (false);
return error;
}
std::string getCarNumber(std::string text) {
int i = 0;
std::regex re("\\d{2,3}\\W{2}\\s{0,}\\d{4}");
std::smatch match;
if (std::regex_search(text, match, re)) {
return match.str();
}
else {
return "0";
}
}
int main(int argc, const char* argv[]) {
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
Mat drawing;
Mat input = imread("/home/uisoo/Desktop/project/Res/input.JPG");
Mat image;
input.copyTo(image);
cvtColor(image, image, COLOR_RGB2GRAY);
GaussianBlur(image, image, Size(3, 3), 1, 1, BORDER_DEFAULT);
Canny(image, image, 100, 300, 3);
findContours(image, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
std::vector<std::vector<Point>> poly(contours.size());
std::vector<Rect> t(contours.size());
std::vector<Rect> bound;
for (int i = 0; i < contours.size(); i++) {
approxPolyDP(Mat(contours[i]), poly[i], 1, true);
t[i] = boundingRect(Mat(poly[i]));
}
drawing = Mat::zeros(image.size(), CV_8UC1);
image.copyTo(drawing);
cvtColor(drawing, drawing, COLOR_GRAY2RGB);
for (int i = 0; i < contours.size(); i++) {
double ratio = (double)t[i].height / t[i].width;
if ((ratio <= 2.5) && (ratio >= 0.5) && (t[i].area() <= 700) && (t[i].area() >= 100)) {
rectangle(drawing, t[i].tl(), t[i].br(), Scalar(0, 255, 0), 0.1, 8, 0);
bound.push_back(t[i]);
}
}
sort(bound.begin(), bound.end(), myobject);
int selectIndex = 0, maxCount = -1;
for (int i = 0; i < bound.size(); i++) {
int count = 0;
for (int j = i + 1; j < bound.size(); j++) {
int delta_x = bound[j].x - bound[i].x;
int delta_y = abs(bound[j].y - bound[i].y);
if (delta_x > 150) break;
if (delta_x == 0) delta_x = 1;
if (delta_y == 0) delta_y = 1;
double gradient = (double)delta_y / delta_x;
if (gradient < 0.25)
count += 1;
}
if (count > maxCount) {
selectIndex = i;
maxCount = count;
}
}
Mat selectContour;
image.copyTo(selectContour);
cvtColor(selectContour, selectContour, COLOR_GRAY2RGB);
std::vector<Rect> carNumber;
carNumber.push_back(bound[selectIndex]);
rectangle(selectContour, bound[selectIndex].tl(), bound[selectIndex].br(), Scalar(0, 255, 0), 0.1, 8, 0);
for (int i = selectIndex + 1; i < bound.size(); i++) {
int delta_x = bound[i].x - bound[selectIndex].x;
int delta_y = abs(bound[i].y - bound[selectIndex].y);
if (delta_x > 150) break;
if (delta_x == 0) delta_x = 1;
if (delta_y == 0) delta_y = 1;
double gradient = (double)delta_y / delta_x;
if (gradient < 0.25) {
carNumber.push_back(bound[i]);
rectangle(selectContour, bound[i].tl(), bound[i].br(), Scalar(0, 255, 0), 0.05, 8, 0);
}
}
rectangle(selectContour, carNumber.begin()[0].tl(), carNumber.end()[-1].br(), Scalar(0, 0, 255), 1, 8, 0);
int offset = 5;
Mat output;
input.copyTo(output);
output = output(Rect(Point(carNumber.begin()[0].tl().x - offset, carNumber.begin()[0].tl().y - offset), Point(carNumber.end()[-1].br().x + offset, carNumber.end()[-1].br().y + offset)));
imwrite("/home/uisoo/Desktop/project/output.JPG", output);
tesseract::TessBaseAPI* api = new tesseract::TessBaseAPI();
api = new tesseract::TessBaseAPI();
if (api->Init("/home/uisoo/library/tesseract-main", "kor")) {
return -1;
}
Pix* pix = pixRead("/home/uisoo/Desktop/project/output.JPG");
api->SetImage(pix);
api->SetPageSegMode(tesseract::PSM_SINGLE_LINE); // 단일 텍스트 줄
std::string recognizedText = api->GetUTF8Text();
std::string text = utf8_to_string(recognizedText.c_str());
text = getCarNumber(text);
// 인식된 번호판 번호 출력
std::cout << "인식된 번호판 번호: " << text << std::endl;
std::ofstream file("carNumber");
if (file.is_open()) {
file << text;
file.close(); // 열었떤 파일을 닫는다.
}
else {
return 1;
}
// 인식 결과 메모리 해제
api->End();
delete api;
pixDestroy(&pix);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment