gpt4 book ai didi

c++ - 如何解决 OpenCV 中的 "Access violation reading location"错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:43 26 4
gpt4 key购买 nike

我在使用 OpenCV 进行抓取时遇到以下运行时错误。

“访问违规读取位置”

我想做的是从面部检测器和背景减法器中获取种子以进行抓取。
我的面部检测器的种子存储在 PrFg_seed_FaceExtended(面部检测矩形扩展到最后一行),Fg_seed_inside_face(面部检测到的较小矩形)countoursFrame 中的所有红色像素都是我要添加到种子的附加像素。任何想法我怎么能做到这一点?

有趣的是,这个运行时错误是在视频中处理了三帧之后出现的。

如果我排除我试图将 contoursFrame 中的红色像素标记为 GC_PR_FGD 的 for 循环,代码似乎可以正常工作。

contoursFrame 只是框架的克隆。我使用 contoursFrame 上的 drawContours 函数绘制轮廓。

代码片段:

cv::Mat1b markers(frame.rows,frame.cols);
cv::Mat1b fg_seed_inside_face = markers(rectangle_inner);
cv::Mat1b Prfg_seed_FaceExtended = markers(rectangle_outer);

markers.setTo(cv::GC_PR_BGD);
Prfg_seed_FaceExtended.setTo(cv::GC_PR_FGD);
fg_seed_inside_face.setTo(cv::GC_FGD);





for(i=0;i<frame.rows;i++){
for(j=0;j<frame.cols;j++){
if ((contoursFrame.at<Vec3b>(Point(i,j))[0]==0) && (contoursFrame.at<Vec3b>(Point(i,j))[1]==0) && (contoursFrame.at<Vec3b>(Point(i,j))[2]==255)){
//cout << "\nFound a red pixel";
markers.at<uchar>(i,j) = cv::GC_PR_FGD;
}
}
}

waitKey(100);


cv::Mat bgd, fgd;
int iterations = 1;
cv::grabCut(frame, markers, cv::Rect(), bgd, fgd, iterations, cv::GC_INIT_WITH_MASK);
cout << "Grabcut Worked!";
cv::Mat1b mask_fgpf = ( markers == cv::GC_FGD) | ( markers == cv::GC_PR_FGD);

最佳答案

您正在使用 Point(int _x, int _y)但根据您的 for 循环提供 (row,col)。它会崩溃,除非你有一个方形框架,但列多于行,你会从框架的数据缓冲区中读取更多,并且可能会更快崩溃。这是因为 cv::Mat 将数据存储在 row-major order 中(一行接一行)。

请注意 docs for at声明 at(int i, int j)at(Point pt) 用法,并将 pt 指定为:

pt – Element position specified as Point(j,i)

这意味着您需要交换 ij 或者在调用 at 时不使用 Point .

关于c++ - 如何解决 OpenCV 中的 "Access violation reading location"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24669893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com