C++ 在“for”循环中调试if条件语句时,断言失败
我想将0像素值与掩码图像中具有0像素值的像素位置等同于灰度img12图像中的相同位置,这是一个灰度图像。当我将for循环放入try-catch块时,它给了我错误,断言失败,如果不使用try-catch,错误是0x755b0f22处的未处理异常和内存位置0x004af338处的cv::Exception。。我正在使用opencv 3.0.0测试版和Visual Studio 2010C++ 在“for”循环中调试if条件语句时,断言失败,c++,opencv,C++,Opencv,我想将0像素值与掩码图像中具有0像素值的像素位置等同于灰度img12图像中的相同位置,这是一个灰度图像。当我将for循环放入try-catch块时,它给了我错误,断言失败,如果不使用try-catch,错误是0x755b0f22处的未处理异常和内存位置0x004af338处的cv::Exception。。我正在使用opencv 3.0.0测试版和Visual Studio 2010 #include <opencv2/imgproc/imgproc.hpp> #include <
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/calib3d.hpp>
#include <iostream>
#include <sstream>
using namespace cv;
using namespace std;
int main()
{
// Reading Mask and Creating New Image
Mat grayimg, grayimg12, input, Mask; int keyboard;
input = imread("peter.jpg");
cvtColor(input, grayimg, COLOR_BGR2GRAY);
grayimg.copyTo(grayimg12, grayimg);
namedWindow("Gray Converted Frame");
imshow("Gray Converted Frame", grayimg);
int r = input.rows; int c = input.cols;
Mask = grayimg > 100;
namedWindow("Binary Image");
imshow("Binary Image", Mask);
try
{
for (int i=1;i<=r;i++)
{
for (int j=1;j<=c; j++)
{
if (Mask.at<uchar>(i,j) == 0)
{
grayimg12.at<uchar>(i,j) = 0;
}
else
grayimg12.at<uchar>(i,j) = grayimg.at<uchar>(i,j);
}
}
}
catch(Exception)
{
cout<<"Hi..";
}
namedWindow("Gray Output Image");
imshow("Gray Output Image", grayimg12);
keyboard = waitKey( 10000 );
return 0;
}
您的循环索引被关闭了1,因此当您尝试访问超出映像边界的内存时,会出现异常。更改:
for (int i=1;i<=r;i++)
{
for (int j=1;j<=c; j++)
{
致:
<>注意,在C、C++和相关语言中,数组是零的。因此,大小为N的数组的有效索引范围是从0到N-1(包括0到N-1)。c++不是matlab。必须从0迭代到第1行。此外,请尽可能避免写入每像素循环。您可以简单地使用grayImg.copyTograyImg12,mask;谢谢对于图像,它工作得很好,但对于视频,它产生了问题,我不知道为什么,因为它必须类似地工作。
for (int i=0;i<r;i++) // for i = 0 to r-1
{
for (int j=0;j<c; j++) // for j = 0 to c-1
{