[问题] connected components 相关错误

楼主: AceID (哈囉)   2015-06-14 11:38:45
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Visual Studio C++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
OpenCV
问题(Question):
自己写了一个跑connected area的简单C++ 程式
没想到出现了google后仍完全不知道从何解起的错误...
不过从错误码看起来感觉是vector部分的问题
有请神人前辈们解答了!
预期的正确结果(Expected Output):
将各connected area重新配色,但区域不变
错误结果(Wrong Output):
error视窗里的讯息不适每次都一样 极为神奇
好像都是存取违规、stack overflow之类的状况
http://i.imgur.com/WQXxgIU.png
http://i.imgur.com/uHVc4Mi.png
程式码(Code):(请善用置底文网页, 记得排版)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <vector>
using namespace cv;
using namespace std;
#define vec2db vector<vector<bool> >
vec2db istaken;
int h = 0, w = 0;
const int dx4[4] = { -1, 0, 1, 0 };
const int dy4[4] = { 0, -1, 0, 1 };
const int dx8[8] = { -1, -1, 0, 1, 1, 1, 0, -1 };
const int dy8[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
Mat drawblob(Mat &img);
int main(int argc, char **argv)
{
Mat src = cv::imread("Newcolor2.png", 1);
cv::imshow("src", src);
h = src.rows, w = src.cols;
// 二维vector "istaken" 初始化
printf("starts istaken initializing.\n");
for (int i = 0; i < w; i++) {
vector<bool> nb;
for (int j = 0; j < h; j++) {
nb.push_back(false);
}
istaken.push_back(nb);
}
printf("image(w*h)=(%d*%d).\n", w, h);
Mat cln = src.clone();
cln = drawblob(cln);
cv::imshow("srcclone", cln);
printf("Done.\n");
cv::waitKey(0);
return 0;
}
void neighborsearch(Mat &img, int i, int j, int r, int g, int b){
//int h = img.rows, w = img.cols;
// 标记该点已走过
istaken[i][j] = true;
// 储存该点的颜色
int r0 = img.at<cv::Vec3b>(j, i)[0];
int g0 = img.at<cv::Vec3b>(j, i)[1];
int b0 = img.at<cv::Vec3b>(j, i)[2];
// 存成与主点相同的颜色
img.at<cv::Vec3b>(j, i)[0] = r;
img.at<cv::Vec3b>(j, i)[1] = g;
img.at<cv::Vec3b>(j, i)[2] = b;
// access该点的相邻四点
for (int k = 0; k < 4; k++) {
int x = i + dx4[k], y = j + dy4[k];
if (x >= 0 && x < w && y >= 0 && y < h && istaken[x][y] == false){
if ((img.at<cv::Vec3b>(y, x)[0] == r0)
&& (img.at<cv::Vec3b>(y, x)[1] == g0)
&& (img.at<cv::Vec3b>(y, x)[2] == b0)) {
neighborsearch(img, x, y, r, g, b);
}
}
}
}
Mat drawblob(Mat &img){
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
if (istaken[i][j] == false){
// 该相邻区块颜色
int arear1 = rand() % 256;
int areag1 = rand() % 256;
int areab1 = rand() % 256;
neighborsearch(img, i, j, arear1, areag1, areab1);
}
}
}
return img.clone();
}
补充说明(Supplement):
有请各位神人前辈们帮忙指点错误之处了!!><
作者: kevingwn (如云如风的人生)   2015-06-14 15:55:00
code简单看来没有问题,应该是递回过多堆叠爆了,减小w及h的值试试,若正常则加大堆叠或不要用递回

Links booklink

Contact Us: admin [ a t ] ucptt.com