C ++程序挂起imshow命令

时间:2016-02-27 19:46:08

标签: c++ opencv imshow

我有一些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;同样的问题。 所以它必须是某种内存泄漏而不是我的代码,对吧?你究竟如何修复内存泄漏?

1 个答案:

答案 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;
}

black/white diagonal

我做了一些小改动:

  • 循环索引测试应为< 256,而不是< 255,除非您特别不想修改最后一行或列。
  • 您可以使用int k = j + 1启动内部循环,以避免不必要的循环迭代和if (k > j)测试。
  • 您将black设置为三通道标量值。当我将其更改为Scalar(0, 0, 0)时,我仍然可以使用,但你仍然不应该这样做。

我尝试了你的代码,它也有效。你没有提到你正在运行的操作系统。我正在运行OS X.