我有一些C ++ - 代码由于某种原因不断挂起。 这是代码:
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
cout <<"started";
Mat im(256, 256, CV_8UC1, cv::Scalar(255));
for (int j = 0; j < 255; j++) {
for (int k = 0; k < 255; k++) {
if (k > j) {
cv::Mat black(im, cv::Rect(j, k, 1, 1));
black = cv::Scalar(0, 0, 0);
}
}
}
Mat image2;
//cvtColor(image, image2, CV_BGR2GRAY);
cout<<"started";
imshow("", im);
waitKey(0);
return 0;
}
现在,我已经尝试了3天了,从字面上删除了该代码的每一行并将其重新放入,这一切都归结为:
必须是 imshow() 导致程序挂起,导致图像无法显示。
奇怪的是,我逐字逐句地从我的旧程序中复制,它工作,甚至在新项目中工作了一天,然后突然开始挂起,这意味着程序只是保持运行和运行而没有任何结果不能被关闭。
显然,我必须在这里忽略这个基本的,但我根本找不到它。
请帮帮忙?
我的操作系统是Ubuntu 15.10。另外,我刚尝试了SSteves的答案=&gt;同样的问题。 所以它必须是某种内存泄漏而不是我的代码,对吧?你究竟如何修复内存泄漏?
答案 0 :(得分:1)
试试这个。它适用于我,并做你所描述的。
#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
int main(int argc, char *argv[]) {
Mat image(256, 256, CV_8UC1, Scalar(255));
for (int j = 0; j < 256; j++) { //index goes to < 256, not < 255
for (int k = j + 1; k < 256; k++) { //start loop at j + 1 to eliminate if (k > j) test
Mat black(image, Rect(j, k, 1, 1));
black = Scalar(0); //only one value in Scalar since this is a single-channel image
}
}
cv::imshow("", image);
// wait for key
cv::waitKey(0);
return 0;
}
我做了一些小改动:
< 256
,而不是< 255
,除非您特别不想修改最后一行或列。int k = j + 1
启动内部循环,以避免不必要的循环迭代和if (k > j)
测试。black
设置为三通道标量值。当我将其更改为Scalar(0, 0, 0)
时,我仍然可以使用,但你仍然不应该这样做。我尝试了你的代码,它也有效。你没有提到你正在运行的操作系统。我正在运行OS X.