값이 0 인 빈 행렬 hide_image
을 만듭니다. 부적절합니다 - 672x896. 각 요소는 값으로 채워 져야합니다. 루프로 처리합니다. 그러나 (0, 299)
요소 코드에 예외를 던져 :cv :: cv :: Mat 객체를 루핑하는 동안 메모리 위치에 예외가 발생했습니다.
Unhandled exception at 0x00007FFD3C063C58 in stego.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000D2B033E5F0. occurred
나는 기능을 디버깅과 예외가 루프에서 J 값의 의존하는 것을 발견했다. j를299로 설정하면 프로그램이 문제없이 작동하지만 모든 행렬이 필요합니다. 명령 줄에 다음 메시지가 표시됩니다.
OpenCV Error: Assertion failed ((unsigned)(i1 * DataType<_Tp>::channels) <
(unsigned)(size.p[1] * channels())) in cv::Mat::at, file c:\opencv-
3.3.1\opencv\build\include\opencv2\core\mat.inl.hpp, line 1095
잘못된 행렬 초기화로 인해 문제가 발생할 수 있지만 그 이유는 무엇입니까? 행 수가 맞고 j를298로 설정하면 루프는 i = 671에서 끝납니다. 그러나 기둥이 적어서 숫자 299가 아무 것도에 의존하지 않는 것 같습니다.
cv::Mat hide_image;
int hide_image_cols = 0, hide_image_rows = 0;
int i_current = 0, j_current = 15;
int curr_bit = 0;
get_img_dim(image, hide_image_cols, hide_image_rows);
hide_image = cv::Mat(hide_image_rows, hide_image_cols, CV_8U);
hide_image = cv::Mat::zeros(hide_image_rows, hide_image_cols, CV_8U);
std::cout << (hide_image.at<cv::Vec3b>(671, 299)) << std::endl; // exception
for (int i = 0; i < hide_image.rows; i++)
for (int j = 0; j < hide_image.cols; j++) {
//exception when j>298
std::cout << (hide_image.at<cv::Vec3b>(i, j)) << std::endl;
}
왜이 예외가 발생합니까? 초기화 동안