我正在尝试使用 cornerharris 函数在图像中查找角点特征。当我尝试检查哪些坐标的值大于 cornerharris 输出 Mat 对象最大值的 1% 时,我将像素值更改为红色。我的逻辑在 python 中似乎工作正常,但在 CPP 中,我在特定坐标处出现分段错误
我试过下面的代码,但遇到了分段错误 if(dst.at(i,j) > corners_perc/100*maxVal)
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <stdio.h>
#include <iostream>
using namespace cv;
using namespace std;
string type2str(int type) {
string r;
uchar depth = type & CV_MAT_DEPTH_MASK;
uchar chans = 1 + (type >> CV_CN_SHIFT);
switch ( depth ) {
case CV_8U: r = "8U"; break;
case CV_8S: r = "8S"; break;
case CV_16U: r = "16U"; break;
case CV_16S: r = "16S"; break;
case CV_32S: r = "32S"; break;
case CV_32F: r = "32F"; break;
case CV_64F: r = "64F"; break;
default: r = "User"; break;
}
r += "C";
r += (chans+'0');
return r;
}
Mat getcorners(Mat image){
Mat dst, image_gray;
Mat imcopy = image.clone();
cvtColor(image, image_gray, COLOR_BGR2GRAY);
cornerHarris(image_gray, dst, 3, 3, 0.01);
//Create image copy of same size of image
Point minLoc, maxLoc;
double minVal, maxVal;
minMaxLoc(dst, &minVal, &maxVal, &minLoc, &maxLoc);
std::cout<<"Max value in dst mat ="<<maxVal<<std::endl;
int corners_perc = 1;
for(int i = 0; i<image.rows; i++){
for(int j = 0; j<image.cols; j++){
if(dst.at<double>(i,j) > corners_perc/100*maxVal){
//if(i % 15 == 13){
imcopy.at<Vec3b>(i,j)[0] = 0;
imcopy.at<Vec3b>(i,j)[1] = 0;
imcopy.at<Vec3b>(i,j)[2] = 255;
//std::cout<<"DST value = "<<dst.at<double>(i,j)<<std::endl;
if(i>290){
std::cout<<"values = "<<dst.at<double>(i,j)<<", i = "<<i<<", j = "<<j<<"\n";
}
}
}
}
std::cout<<dst.at<double>(1,10)<<std::endl;
if(dst.at<double>(1,10) > corners_perc/100*maxVal){
std::cout<<"values = "<<imcopy.at<double>(1,10)<<"\n";
}
std::cout<<"Image values = "<<imcopy.at<Vec3b>(200,450)<<"\n";
std::cout<<"Image cols = "<<imcopy.cols<<"x"<<imcopy.rows<<"\n"<<"Color: "<<imcopy.at<Vec3b>(imcopy.rows-1, imcopy.cols-1)<<"\n";
std::cout<<"Dst vals = "<<type2str(dst.type())<<"\n"<<type2str(imcopy.type())<<"\n"<<dst.at<int>(449,460)<<"\n";
return imcopy;
}
int main(int argc, char** argv)
{
if (argc != 2) {
printf("usage: DisplayImage.out <Image_Path>\n");
return -1;
}
Mat image, image_gray, image_corners;
image = imread(argv[1], 1);
if (!image.data) {printf("No image data \n"); return -1;}
std::cout<<"Image size = "<<image.size()<<", test = "<<image.size[0]<<"X"<<image.size[1]<<std::endl;
image_corners = getcorners(image);
namedWindow("Display Image", WINDOW_AUTOSIZE);
imshow("Display Image", image_corners);
waitKey(0);
return 0;
}