【发布时间】:2018-11-26 10:49:12
【问题描述】:
我是新的 opencv c++ 开发人员。我应用了 SLIC 超像素,所以我有 Mat:labels 包含每个像素的 ID,我在图像上应用 SPLIT 以获得绿色通道,然后我希望更改 ID=150 的特定像素的值(每个pixel =! of 150 必须转换为黑色像素)。调试后我得到了这个错误和这个window:
在 0x00007FFB63A0A388 处引发异常:Microsoft C++ 异常:内存位置 0x0000001496AFE290 处的 cv::Exception。 0x00007FFB63A0A388 处未处理的异常:Microsoft C++ 异常:内存位置 0x0000001496AFE290 处的 cv::Exception。
这是我的代码
int main()
{
Mat labels;
Mat RGB[3], HSV[3],S_HSV,image3;
vector<double> STD, generale_mean;
Mat image, Red, Green, Blue, image2,mask,Gray;
int region_number;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
image = imread("D:\\mémoire\\eye.png", CV_LOAD_IMAGE_COLOR);
//applying the superpixel
Ptr<cv::ximgproc::SuperpixelSLIC> slic = cv::ximgproc::createSuperpixelSLIC(image, 100,50, 0.01);
slic->iterate(10);
if (true)
slic->enforceLabelConnectivity(50);
slic->getLabelContourMask(mask, true);
image.setTo((0, 0, 255), mask);
slic->getLabels(labels);
region_number = slic->getNumberOfSuperpixels();
cv::cvtColor(image, image, CV_BGR2RGB);
cv::cvtColor(image, Gray,CV_RGB2GRAY);
split(image, RGB);
Red.push_back(RGB[0]);
Green.push_back(RGB[1]);
Blue.push_back(RGB[2]);
int f = 150;
Mat Green1 = Green.clone();
int Y =0;
for (int j = 0; j < Green1.rows; j++) {
for (int i = 0; i < Green1.cols; i++) {
double N = labels.at<double>(Point(i, j));
if (N =! f)
Green1.at<double>(Point(i, j)) = 00000;
}
}
cv::imshow("green", Green1);
waitKey(0); // Wait for a keystroke in the window
return 0;
}
【问题讨论】:
-
你调试过这个吗?这还不足以让我们为您提供更多帮助。
-
我会更新我的帖子并放上所有代码
-
抛出的异常是什么?错误信息基本上只是说 OpenCV 抛出了异常,但并没有显示 opencv 异常的详细信息。例如,调用堆栈真的很有帮助。
-
如何显示异常?!
-
错误在这一行
Green1.at<double>(Point(i, j)) = 00000;first is an uchar not a double, 你可以不用像这样的点Green1.at<uchar>(j,i) = 0;注意在接收行、列与接收 x 的点的比较,y
标签: c++ visual-studio opencv