visual studio 2010 — масштабирование пикселей изображения с использованием библиотеки opencv и переполнения стека

Я пытаюсь создать простой 1D Barcode Reader, используя OpenCV 2.4.5 и Visual Studio 2010 Express.

Вот мой код до сих пор:

//define Image path:
char* imageName = "D:\\Barcode Reader\\test3.jpg";
cv::Mat src = cv::imread(imageName);

if( !src.data )
{ return -1; }

//convert image to grayscale img:
cv::Mat gray_image;
cvtColor (src, gray_image, CV_BGR2GRAY);

unsigned char color;
unsigned char next_black_color = 0;
unsigned char next_white_color = 0;
int buffer[500];

float factor = (float)gray_image.cols / (float)required_width;

//start to search for pixels from left to right (in the middle of the img):
unsigned char *position  = gray_image.ptr(gray_image.rows/2,0);

//iterate through the whole image length:
for (int col = 1; col <= gray_image.cols; col++)
{
//...and store the pixel value in color variable for possible output (which would be like 0-127 for black colors and 127-255 for white colors:
color = *position;
position++;
//check the pixel value ( < 127 everything bellow has dark color):
if (color < 127)
{
//...and after each position checked, go to next pixel and save the number of occurences of black pixels:

next_black_color++;
buffer[col] = next_black_color;
std::cout << col << ": " << buffer[col] << " ";
}
else
{
//set the counter variable to null for the next occurence of black pixel:
next_black_color = 0;
}
//the same goes for white pixels:
if (color > 127)
{
next_white_color++;
buffer[col] = next_white_color;
std::cout << col << ": " << buffer[col] << " ";
}
else
{
next_white_color = 0;
}
}

//show the results:
std::cout<<" Number of pixels in width = " << src.cols << std::endl <<
"Number of pixels in height = " << src.rows << std::endl;

cv::imshow("Normal Image", src);
cv::imshow("Gray Image", gray_image);

cv::waitKey(0);

return 0;

Тестовое изображение размером 100×100 пикселей с черно-белыми пикселями в следующем порядке
(описывается как двоичный код для лучшего понимания: 1 = черный, 0 = белый)
10100<..белые пиксели ..> 00101

Причина, по которой я это делаю, проста …

Допустим, у меня есть штрих-код UPC, длина которого может быть 81 пиксель.
Тем не менее, мое загруженное изображение имеет длину более 1000 пикселей.

Чтобы применить обнаружение и сравнить мое загруженное изображение с шаблоном UPC, мне нужно сначала масштабировать загруженное изображение, чтобы скорректировать значение пикселя. (Я использую слово «масштаб» … потому что, если бы я просто «изменил размер» моего изображения … это бы обрезало 919 пикселей, делая невозможным обнаружение.)

  • Я знаю, что загруженное изображение имеет коэффициент 12,34 к шаблону UPC (что близко к 12 …. Мне сейчас нет дела до правильных значений … все, что меня волнует, это реализация в данный момент … )

    • Таким образом, чтобы достичь масштабирования, я должен посчитать появление каждого черно-белого пикселя,
      сохранить его в массив, а затем разделить его с моим фактором, чтобы получить масштабированное значение.

Я сталкиваюсь со следующей проблемой, используя эту реализацию:

События будут храниться следующим образом:

____[Array]____
Position | Occurence
1 ......... 1 (First position with first black pixel)
2 ......... 1 (white)
3 ......... 1 (black)
4 ......... 1 (white pixels until next black pixel appears..)
5 ......... 2 (___Problem here!___ ... should be 94!)
6 ......... 3          .
. ......... .          .
100 ....... 100(end)

Но это должно быть:

____[Array]____
Position | Occurence
1 ......... 1  (First position with first black pixel)
2 ......... 1  (white)
3 ......... 1  (black)
4 ......... 94 (count all white pixels until black appears again)
5 ......... 1  (black)
6 ......... 1  (white)
7 ......... 1  (black) -> end

Я надеюсь, что предоставлю достаточно информации, необходимой для ответов.

Пожалуйста, помогите мне исправить мой код.
С наилучшими пожеланиями
Ондрей

1

Решение

Я думаю, тебе следует переделать свой цикл. Это правильно, но слишком сложно. Проблема с вашим кодом в этой строке:

buffer[col] = next_black_color;

Переменная седло всегда увеличивается, поэтому обновленный счетчик цветов добавляется в новый слот в массиве. Вы не можете иметь 97 в позиции 5 в вашем примере, потому что, учитывая ваш код, в позиции 5 вы обработали только 5 пикселей.

Другая небольшая проблема с вашим кодом состоит в том, что у вас есть два взаимоисключающих условия. Если цвет < 127 и цвет> 127. Прежде всего, если цвет < 127, остальное означает, что цвет> = 127. Знак равенства важен! Ваш код потерпит неудачу, если все цвета будут 127.

Ниже приводится черновой вариант алгоритма:

int arr[] = {0,0,180,180,180,180,180,180,180,180,180,0,0,0};
int size = 14;

bool last_dark = false;
bool current_dark = false;

if(arr[0] < 127){
last_dark = true;
}

int counter = 0;
for(int i = 0; i < size; i++){
if(arr[i] < 127){
current_dark = true;
} else {
current_dark = false;
}

// is current pixel same shade as last?
if(last_dark == current_dark){
counter++;
} else {
cout << counter << endl;
counter = 1; // the last color is already processed
}
last_dark = current_dark;
}
// following line is important to get the last count
cout << counter << endl;

Ни в коем случае это не завершено. Вам придется адаптироваться к вашим потребностям. В последнем случае мы не можем сравнивать последнее и текущее значение напрямую, потому что 120 и 12 оба темные, но не одно и то же значение. В вашем коде замените cout на правильное назначение вектора, и не забывайте тот, что находится вне цикла. 😉

С Уважением,

jnovacho

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector