OpenCV - Konvertieren von Vektor-Vektor-Matte
Ich konvertieren wollen vector<vector<double> >
zu Mat
da muss ich anwenden einer benutzerdefinierten glatte filter auf diese Werte.
Das Bild unten zeigt die KORREKTEN Werte
Habe ich versucht, diese.
std::vector<std::vector<double> > angles;
calculateAngles(angles);
Mat matAngles(angles.size(), angles.at(0).size(), CV_64FC1, angles.data());
Aber die Werte in den ersten Spalten werden falsch konvertiert, wobei der Wert 2.12566 e-314.
Das resultierende Bild
Ich habe auch versucht, die Werte direkt in die Mat
.
void calculateAngles(cv::Mat& im, cv::Mat& angles, int blockSize, int(*f)(int x, int y), int(*g)(int x, int y)){
static int ySobel[3][3] = {{ -1, 0, 1}, { -2, 0, 2}, { -1, 0, 1}};
static int xSobel[3][3] = {{ -1, -2, -1}, {0, 0, 0}, {1, 2, 1}};
angles.create(cv::Size(im.cols/blockSize+1, im.rows/blockSize+1), CV_64FC1);
int nominator;
int denominator;
int GX, GY;
double angle;
for(int i = 1; i < im.cols; i += blockSize){
for(int j = 1; j < im.rows; j += blockSize){
nominator = 0;
denominator = 0;
for(int k = i; k < std::min(i + blockSize, im.cols-1); k++){
for(int l = j; l < std::min(j + blockSize, im.rows-1); l++){
GX = applyKernelAt(im, xSobel, k, l);
GY = applyKernelAt(im, ySobel, k, l);
nominator += f(GX, GY);
denominator += g(GX, GY);
}
}
angle = (PI + std::atan2(nominator, denominator)) / 2;
angles.at<double>((i-1)/blockSize, (j-1)/blockSize) = angle;
}
}
}
Aber die Werte wiederholen sich nach einem bestimmten Punkt.
Dies ist, wie die Werte sind gedruckt
void drawLines(cv::Mat& src, cv::Mat& dst, cv::Mat& angles, int blockSize){
cv::Size size = src.size();
dst.create(src.size(), src.type());
//for a white background
dst += 255;
cv::cvtColor(dst, dst, CV_GRAY2BGR);
int x1,y1,x2,y2;
for(int i = 1; i < size.width; i += blockSize){
for(int j = 1; j < size.height; j += blockSize){
double tang = std::tan(angles.at<double>((i-1)/blockSize,(j-1)/blockSize));
if( tang >= -1 && tang <= 1 ){
x1 = i;
y1 = (-blockSize/2) * tang + j + blockSize/2;
x2 = i + blockSize;
y2 = (blockSize/2) * tang + j + blockSize/2;
}else{
x1 = i + blockSize/2 + blockSize/(2*tang);
y1 = j + blockSize/2;
x2 = i + blockSize/2 - blockSize/(2*tang);
y2 = j -blockSize/2;
}
cv::line(dst, cv::Point(x1,y1), cv::Point(x2,y2), cv::Scalar(0,0,255));
}
}
}
InformationsquelleAutor Rayron Victor | 2013-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Weg, um füllen Sie eine cv::Mat aus einem Vektor von Vektoren.
InformationsquelleAutor bruvel
Wenn Sie wollen, um temporäre Kopie einen großen Teil des std:vector von std::vector-Daten zu cv::Mat, ohne Sie zu kopieren, die besonders effektiv ist:
Beachten Sie, dass:
...ansonsten bekommen Sie memory-Korruption/Absturz.
InformationsquelleAutor kecsap