Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2018, 01:09   #1
gefard
Пользователь
 
Регистрация: 26.05.2012
Сообщений: 13
По умолчанию Привести строки к общему виду

Предыстория:
Поставили камеры на предприятии и я решил собрать распознавание автомобильных номеров, вести лог + фото проезжающих машин через КПП.
Задачка вроде не сложная. Быстро нашел пример https://github.com/KostyaKulakov/Russian_System_of_ANPR
Собрал его для работы с RTSP потоком и вроде бы все отлично

Но как всегда всплывает одно НО
за то время когда машина проезжает КПП номер машины может быть распознан до 25 раз разным, расстояния, угол все сказывается.

А677ЕА16
Д677ЕН16
А477ЕН14
и тд.

Я решил сравнить эти строки по символам и использовать наиболее встречающийся символ для получения итогового номера А677ЕН16

Но сделать как не знаю. Можно ли использовать строку как ключ?
типа:
Цитата:
std::vector<std::string> array;
array[] = "А677ЕА16";
array[] = "Д677ЕН16";
array[] = "А477ЕН14";

for(i=0;i<array.size();i++) {

if(array_first_simbol[ array[i][0] + array[i][1] ]) // первый символ А и Д считем их количество
array_first_simbol[ array[i][0] + array[i][1] ] = 1;
else
array_first_simbol[ array[i][0] + array[i][1] ]++;

if(array_two_simbol[ array[i][2] ]) // второй символ 6 или 4
array_two_simbol[ array[i][2] ] = 1;
else
array_two_simbol[ array[i][2] ]++;

}
Извиняюсь заранее за мой глупый вопрос, на любимом PHP написал бы если он на это годный был (работа с камерами ). но все примеры работы с массивами видел для С++ на int
gefard вне форума Ответить с цитированием
Старый 07.06.2018, 03:05   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Код:
// Example program
#include <iostream>
#include <string>
#include <vector>
#include <map>

using keyt = char; 
using arr_t  = std::vector<std::string>;

std::string array2string(const arr_t& src)
{ 
  std::string result;
  for (size_t i = 0, sz = src.at(0).length(); i < sz; ++i) //предполагаем, что все строки в массиве одинаковой длины
  {
     std::map<keyt, int> counter;
     for (const auto& s : src)
     {
           const keyt key = s[i];
           if (counter.count(key))
              ++counter[key];
           else
             counter[key] = 0;
     }
     
     keyt max_c; int max = 0;
     for (const auto& p : counter)
     {
           if (max < p.second)
           {
                max = p.second;
                max_c = p.first;
           }
     }
     result += max_c; 
  }
  return result;
}


int main()
{
    const std::vector<std::string> array {"А677ЕА16", "Д677ЕН16", "А477ЕН14"};
    std::cout << array2string(array) << "\n";
}
Как-то так я думаю. Только тут еще вот че, char это 1 байт. Так что с русским там кодировки должны норм быть. Хотя можно заменить на std::string, будет чуть-чуть медленее.

Последний раз редактировалось alexzk; 07.06.2018 в 03:22.
alexzk вне форума Ответить с цитированием
Старый 07.06.2018, 07:03   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от gefard Посмотреть сообщение
Но как всегда всплывает одно НО
за то время когда машина проезжает КПП номер машины может быть распознан до 25 раз разным, расстояния, угол все сказывается.
Мы когда-то подобную проблему решили не изменением кода, а чисто административными мерами: экспериментально определили, под каким углом нужно поставить камеру на кпп и какая скорость должна быть у машины, чтоб номер определялся однозначно, после этого поставили знаки ограничения скорости
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 07.06.2018, 16:14   #4
gefard
Пользователь
 
Регистрация: 26.05.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Код:

     std::map<keyt, int> counter;
     for (const auto& s : src)
     {
           const keyt key = s[i];
           if (counter.count(key))
              ++counter[key];
           else
             counter[key] = 0;
     }
Как-то так я думаю. Только тут еще вот че, char это 1 байт. Так что с русским там кодировки должны норм быть. Хотя можно заменить на std::string, будет чуть-чуть медленее.
Спасибо вам, теперь буду знать как посчитать символы. Помогло.
gefard вне форума Ответить с цитированием
Старый 07.06.2018, 16:16   #5
gefard
Пользователь
 
Регистрация: 26.05.2012
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Мы когда-то подобную проблему решили не изменением кода, а чисто административными мерами: экспериментально определили, под каким углом нужно поставить камеру на кпп и какая скорость должна быть у машины, чтоб номер определялся однозначно, после этого поставили знаки ограничения скорости
Да база еще строится, до административных мер еще далеко. А пока тестирую, смотрю что как работает.
gefard вне форума Ответить с цитированием
Старый 10.06.2018, 16:24   #6
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Можно считывать из файла номера и сравнивать посимвольно думаю там удобней
допустим создадим файл на диске Д и создадим в корне файл test.txt в него пишем номера в столбец и из него будем читать наши номера и в случае совпадение выдавать true;
Пример .txt :
Цитата:
A677EH16
D677EH16
A477EH14
A477EH17
B477EH14
Код:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
#pragma warning(disable : 4996)
using namespace std;
struct hider_number
{
	FILE * explo;
	char buffer[10];
	void OpenFile();
	bool isBase(string number);
	void display(string value);
};
bool indexOf(string id, char buffer[])
{
	int idsize = id.length();
	for (int i = 0; i < idsize; i++)
	{ 
		if (id[i] == buffer[i]) continue;
		return false;
	}
	return true;
}

void hider_number::OpenFile()
{
	char filename[] = "D:\\test.txt";//File name and patch
	explo = fopen(filename, "r"); //Open key : r-(write)
}

bool hider_number::isBase(string number)
{
	if (explo == NULL) throw("Error!");
	while (!feof(explo))
	{
		if (fgets(buffer, sizeof(buffer), explo) == NULL) break;
		if (indexOf(number, buffer)) return true;
	}
	return false;
}

void hider_number::display(string value)
{
	printf("%s", isBase(value) == 0 ? "False" : "True");
}
int main()
{
	hider_number numb;
	numb.OpenFile();
	numb.display("A477EH14");
	fclose(numb.explo);
	cout << endl;
	system("pause");
	return 0;
}
2Lui вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Привести к треугольному виду(процедуры) komjkee Паскаль, Turbo Pascal, PascalABC.NET 0 18.12.2013 21:35
Привести к общему знаменателю ParkWay Помощь студентам 0 07.06.2012 06:54
Привести дроби к общему знаменателю. ParkWay Паскаль, Turbo Pascal, PascalABC.NET 3 06.06.2012 17:14