LBP opencv c ++问题 [英] LBP opencv c++ problem

查看:100
本文介绍了LBP opencv c ++问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为图像计算LBP。

i使用此代码:

 cv :: Mat LBP(string src_image )
{
cv :: Mat temp_image = imread(src_image.c_str(), 1 );
cv :: Mat Image(temp_image.rows,temp_image.cols,CV_8UC1);
cv :: Mat lbp(temp_image.rows,temp_image.cols,CV_8UC1);

if (temp_image.channels()== 3
cvtColor(temp_image,Image,CV_BGR2GRAY);

imshow( src_image,Image);

int center = 0 ;
int center_lbp = 0 ;

for int row = 1 ; row< Image.rows; row ++)
{
for int col = 1 ; col< Image.cols; col ++)
{
center = Image.at< int> (row,col);
center_lbp = 0 ;

if (center< = Image.at< int>(row - 1 ,col - 1 ))
center_lbp + = 1 ;

if (center< = Image.at< int>(row - 1 ,col))
center_lbp + = 2 ;

if (center< = Image.at< int>(row - 1 ,col + 1 ))
center_lbp + = 4 ;

if (center< = Image.at< int>(row,col - 1) ))
center_lbp + = 8 ;

if (center< = Image.at< int>(row,col + 1) ))
center_lbp + = 16 ;

if (center< = Image.at< int>(row + 1 ,col - 1 ))
center_lbp + = 32 ;

if (center< = Image.at< int>(row + 1 ,col))
center_lbp + = 64 ;

if (center< = Image.at< int>(row + 1 ,col + 1 ))
center_lbp + = 128 ;

cout<< center lbp value:<< center_lbp<< ENDL;
lbp.at< int>(row,col)= center_lbp;
}
}

imshow( lbp_image,lbp);
waitKey( 0 );
destroyAllWindows();

return lbp;
}





但它在此指令中抛出无法读取内存的异常

 center = Image.at< int>(row,col); 



这是我调试程序时本地人的图像

https://dl.dropboxusercontent.com/u/89320576/Capture.PNG [ ^ ]



问题是什么?

解决方案

在某些表达式中,您尝试访问坐标为行+ 1和col +的像素1。这超出了允许的范围,因为你的行和列变量分别运行到Image.rows - 1 Image.cols - 1. + 1只能让自己超越边缘。



要修复它,只需将循环减少到

   int  row =  1 ; row< Image.rows-  1  ;行++)
{
for int col = 1 ; col< Image.cols- 1 ; col ++)


 Mat LBP(Mat src_image)
{
bool affiche = true;
cv :: Mat Image(src_image.rows,src_image.cols,CV_8UC1);
cv :: Mat lbp(src_image.rows,src_image.cols,CV_8UC1);

if(src_image.channels()== 3)
cvtColor(src_image,Image,CV_BGR2GRAY);

unsigned center = 0;
unsigned center_lbp = 0;

for(int row = 1; row < Image.rows-1; row ++)

{

for (int col = 1; col < < span class =code-attribute> Image.cols-1; col ++)

< span class =code-attribute> {

< span class =code-attribute> center = Image.at< uchar > (row,col);
center_lbp = 0;

if(center < = Image.at< uchar > (row - 1,col - 1))
center_lbp + = 1;

if(center < = Image.at< uchar > (row - 1,col))
center_lbp + = 2;

if(center < = Image.at< uchar > (row-1,col + 1))
center_lbp + = 4;

if(center < = Image.at< uchar > (row,col - 1))
center_lbp + = 8;

if(center < = Image.at< uchar > (row,col + 1))
center_lbp + = 16;

if(center < = Image.at< uchar > (row + 1,col - 1))
center_lbp + = 32;

if(center < = Image.at< uchar > (row + 1,col))
center_lbp + = 64;

if(center < = Image.at< uchar > (row + 1,col + 1))
center_lbp + = 128;
lbp.at < uchar > (row,col)= center_lbp;
}
}
if(affiche == true)
{
cv :: imshow(image LBP,lbp);
waitKey(10);
cv :: imshow(灰度,图片);
waitKey(10);
}

else
{
cv :: destroyWindow(image LBP);
cv :: destroyWindow(灰度);
}

返回lbp;
}
int main()
{
Mat frame1;
frame1 = imread(path image)
LBP(frame1);
返回0;
}


Hi, i want to calculate LBP for an image.
i use this code:

cv::Mat LBP(string src_image)
{
	cv::Mat temp_image = imread(src_image.c_str(), 1);
	cv::Mat Image(temp_image.rows, temp_image.cols, CV_8UC1);
	cv::Mat lbp(temp_image.rows, temp_image.cols, CV_8UC1);

	if (temp_image.channels() == 3)
		cvtColor(temp_image, Image, CV_BGR2GRAY);

	imshow("src_image", Image);

	int center = 0;
	int center_lbp = 0;

	for (int row = 1; row < Image.rows; row++)
	{
		for (int col = 1; col < Image.cols; col++)
		{
			center = Image.at<int>(row, col);
			center_lbp = 0;

			if (center <= Image.at<int>(row - 1, col - 1))
				center_lbp += 1;

			if (center <= Image.at<int>(row - 1, col))
				center_lbp += 2;

			if (center <= Image.at<int>(row - 1, col + 1))
				center_lbp += 4;

			if (center <= Image.at<int>(row, col - 1))
				center_lbp += 8;

			if (center <= Image.at<int>(row, col + 1))
				center_lbp += 16;

			if (center <= Image.at<int>(row + 1, col - 1))
				center_lbp += 32;

			if (center <= Image.at<int>(row + 1, col))
				center_lbp += 64;

			if (center <= Image.at<int>(row + 1, col + 1))
				center_lbp += 128;

			cout << "center lbp value: " << center_lbp << endl;
			lbp.at<int>(row, col) = center_lbp;
		}
	}

	imshow("lbp_image", lbp);
	waitKey(0);
	destroyAllWindows();

	return lbp;
}



but it throw an exception "unable to read memory" at this instruction

center = Image.at<int>(row, col);


and this is image for locals when i debug the program
https://dl.dropboxusercontent.com/u/89320576/Capture.PNG[^]

what is the problem??

解决方案

In some of your expressions you try to access pixels with coordinates row+1 and col+1. That is outside the permitted range, as your row and col variables run to Image.rows - 1 respectively Image.cols - 1. The +1 just gets yourself one over the edge.

To fix it, just reduce the loops to

for (int row = 1; row < Image.rows-1; row++)
{
    for (int col = 1; col < Image.cols-1; col++)


Mat LBP(Mat src_image)
{
    bool affiche=true;
    cv::Mat Image(src_image.rows, src_image.cols, CV_8UC1);
    cv::Mat lbp(src_image.rows, src_image.cols, CV_8UC1);

    if (src_image.channels() == 3)
        cvtColor(src_image, Image, CV_BGR2GRAY);

    unsigned center = 0;
    unsigned center_lbp = 0;

    for (int row = 1; row < Image.rows-1; row++)

    {

        for (int col = 1; col < Image.cols-1; col++)

        {

            center = Image.at<uchar>(row, col);
            center_lbp = 0;

            if (center <= Image.at<uchar>(row - 1, col - 1))
                center_lbp += 1;

            if (center <= Image.at<uchar>(row - 1, col))
                center_lbp += 2;

            if (center <= Image.at<uchar>(row - 1, col + 1))
                center_lbp += 4;

            if (center <= Image.at<uchar>(row, col - 1))
                center_lbp += 8;

            if (center <= Image.at<uchar>(row, col + 1))
                center_lbp += 16;

            if (center <= Image.at<uchar>(row + 1, col - 1))
                center_lbp += 32;

            if (center <= Image.at<uchar>(row + 1, col))
                center_lbp += 64;

            if (center <= Image.at<uchar>(row + 1, col + 1))
                center_lbp += 128;
            lbp.at<uchar>(row, col) = center_lbp;
        }
    }
 if(affiche == true)
            {
              cv::imshow("image LBP", lbp);
              waitKey(10);
              cv::imshow("grayscale",Image);
              waitKey(10);
            }

            else
            {
              cv::destroyWindow("image LBP");
              cv::destroyWindow("grayscale");
            }

    return lbp;
}
int main()
{
    Mat frame1;
       frame1= imread("path image")
       LBP(frame1);
    return 0;
}


这篇关于LBP opencv c ++问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆