2017-02-04 24 views
1

我在Visual Studio 2015社區有一個項目。它編譯沒有任何錯誤,但我得到了compute_edge_map_via_lab和compute_local_minima下的綠色波浪線,它說找不到「compute_edge_map_via_lab」的函數定義。我可以右鍵點擊調用compute_edge_map_via_lab的那一行,然後點擊「轉到定義」,它甚至會將我帶到cpp文件中的定義,這意味着visual studio知道函數的定義位置。所以我不明白這個綠色錯誤。誰可以幫我這個事 ?Visual Studio 2015社區 - 找不到功能定義,但可以編譯

我粘貼了compute_edge_map_via_lab的函數和顯示錯誤的圖像。

enter image description here

#include <boost/heap/fibonacci_heap.hpp> 
#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/iteration_macros.hpp> 
#include <opencv2/opencv.hpp> 
#include <iostream> 
#include <unordered_set> 

#include "image-processing.h" 

int main { 

cv::Mat image = imread("0001.jpg", CV_LOAD_IMAGE_COLOR); 

//compute edge map 
cv::Mat magnitude; 
compute_edge_map_via_lab(image, magnitude); 

//compute local minimas 
cv::Mat markers; 
compute_local_minima(magnitude, markers); 
} 

圖像processing.h

#pragma once 

#include <opencv2/opencv.hpp> 

void compute_edge_map_via_lab(cv::Mat image, cv::Mat edge_map); 
void compute_local_minima(cv::Mat magnitude, cv::Mat markers); 

圖像processing.cpp

#include "image-processing.h" 

void compute_edge_map_via_lab(cv::Mat image, cv::Mat edge_map) { 
int rows = image.rows; 
int cols = image.cols; 

//convert bgr to lab 
cv::Mat image_lab; 
cv::cvtColor(image, image_lab, CV_BGR2Lab); 

//split lab 
std::vector<cv::Mat> image_lab_split(3); 
cv::split(image_lab, image_lab_split); 

//run sobel x and y on lab sets 
std::vector<cv::Mat> image_lab_split_dx(3), image_lab_split_dy(3); 
for (int i = 0; i < 3; i++) 
{ 
    cv::Sobel(image_lab_split[i], image_lab_split_dx[i], CV_32FC1, 1, 0, 3); 
    cv::Sobel(image_lab_split[i], image_lab_split_dy[i], CV_32FC1, 0, 1, 3); 
} 

//----------------------------------------------------------------------------- 
//compute magnitude = term_a   + term_b 
//     = sqrt(Lx^2 + Ly^2) + sqrt(2(ax^2 + ay^2 + bx^2 + by^2)) 
//----------------------------------------------------------------------------- 

//compute sqrt(Lx^2 + Ly^2) 
cv::Mat Lx_squared = cv::Mat(cv::Size(cols, rows), CV_32FC1), 
    Ly_squared = cv::Mat(cv::Size(cols, rows), CV_32FC1); 
cv::pow(image_lab_split_dx[0], 2, Lx_squared); 
cv::pow(image_lab_split_dy[0], 2, Ly_squared); 

//compute term_a 
cv::Mat term_a = cv::Mat(cv::Size(cols, rows), CV_32FC1); 
term_a = Lx_squared + Ly_squared; 
cv::sqrt(term_a, term_a); 

//compute sqrt(2(ax^2 + ay^2 + bx^2 + by^2)) 
cv::Mat ax_squared = cv::Mat(cv::Size(cols, rows), CV_32FC1), 
    ay_squared = cv::Mat(cv::Size(cols, rows), CV_32FC1), 
    bx_squared = cv::Mat(cv::Size(cols, rows), CV_32FC1), 
    by_squared = cv::Mat(cv::Size(cols, rows), CV_32FC1); 
cv::pow(image_lab_split_dx[1], 2, ax_squared); 
cv::pow(image_lab_split_dy[1], 2, ay_squared); 
cv::pow(image_lab_split_dx[2], 2, bx_squared); 
cv::pow(image_lab_split_dy[2], 2, by_squared); 

//compute term_b 
cv::Mat term_b = 2 * (ax_squared + ay_squared + bx_squared + by_squared); 
cv::sqrt(term_b, term_b); 

//compute magnitude 
edge_map = term_a + term_b; 
} 

void compute_local_minima(cv::Mat magnitude, cv::Mat markers) { 

} 
+1

在一個不相關的註釋中,考慮你的函數名稱,並且用'magnitude'變量調用'compute_local_minima',我猜你會修改' 'compute_edge_map_via_lab'函數中的edge_map'是否正確?問題是你通過value *傳遞參數'edge_map' *,而不是通過引用傳遞參數,因此,在compute_edge_map_via_lab'中所做的所有修改都會在函數返回時丟失。 –

+0

哎呀對不起,我創建了另一個項目,只是爲了再次看到綠線。這些變量實際上都是通過引用傳遞的。將編輯帖子。 – Don

+2

所以,你的意思是它的intellisense錯誤,而不是實際的構建錯誤? –

回答

1

至於C++標準而言,它並不重要:只要函數沒有被調用,就可以聲明沒有定義的函數原型。在C++ 11之前的舊版本中,甚至可以利用它:例如,引入默認的構造函數原型來抑制不需要的構造。

這種情況很難智能感知 - 也許這是一件好事,它確實突出顯示它們。 (順便說一下,intellisense在實際的編譯器中使用了一個不同的詞法分析器!)

相關問題