繁体   English   中英

使用opencv库和c ++缩放图像的像素

[英]scale pixels of an image using opencv library and c++

我正在尝试使用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;

测试图像是具有以下顺序的黑白像素的100x100px图像(为更好地理解,将其描述为二进制代码:1 = black,0 = white)10100 <.. white pixels ..> 00101

我这样做的原因很简单...

假设我有一个UPC条形码,可以长81个像素。 但是,我加载的图像的长度超过1000像素。

为了应用检测并将我的加载图像与UPC模式进行比较,我必须先缩放加载图像以正确校正像素值。 (我使用“比例”一词...因为如果我只是“调整”图像的大小...它将切断919个像素,因此无法进行检测。)

  • 我知道加载的图像是UPC模式的12,34倍(接近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

我希望我能提供足够的信息来解答。

请帮助我改正我的代码。 最好的问候Ondrej

我认为您应该重做周期。 是正确的,但是太复杂了。 您的代码存在以下问题:

buffer[col] = next_black_color;

变量col始终在增加,因此将更新的颜色计数添加到阵列中的新插槽。 在示例中,位置5不能有97,因为给定代码在位置5,您只能处理5个像素。

您的代码的另一个小问题是,您有两个互斥条件。 如果color <127并且color>127。首先,如果color <127,则else表示颜色> = 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;

绝不是完整的。 您将必须适应您的需求。 在最后一个if中,我们不能直接比较last和current的值,因为120和12都是暗的,但不是相同的值。 在您的代码中,将cout替换为正确的向量分配,不要忘了循环之外的那个。 ;)

问候,

jnovacho

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM