LBP opencv c ++问题 [英] LBP opencv c++ problem
本文介绍了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屋!
查看全文