OPENCV:image_proc 中的 PCA 应用程序错误
Posted
技术标签:
【中文标题】OPENCV:image_proc 中的 PCA 应用程序错误【英文标题】:OPENCV: PCA application error in image_proc 【发布时间】:2014-02-12 14:55:47 【问题描述】:基地来自这个here。
我收到了这个错误,这是我在调试过程中经过近 3 天的反复试验后剩下的唯一一个错误:
Unhandled exception at 0x000007FEEC6315A4 (opencv_imgproc242.dll) in PCA.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
请在这里有人可以帮助我。我目前使用的是 VS2012,我的操作系统是 win7 64 位。我按照blog 配置我的opencv 2.4.2。
请帮忙!
【问题讨论】:
您能否缩小导致此错误的代码部分? 你是在调试模式下运行的吗? (然后你链接到错误的 dll) 来自我提供的 PCA 站点示例。下面有一个代码。当编译器到达findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
行时,错误开始出现
no.i 将我的配置更改为 x64 并使用 release
。老实说,看看release
和debug
之间的区别。
在调试模式下,你需要以'd'结尾的库,比如opencv_imgproc242d.lib
【参考方案1】:
我已经纠正了一些小错误(现在它对我来说非常完美):
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
double getOrientation(vector<Point> &pts, Mat &img)
if (pts.size() == 0) return false;
//Construct a buffer used by the pca analysis
Mat data_pts = Mat(pts.size(), 2, CV_64FC1);
for (int i = 0; i < data_pts.rows; ++i)
data_pts.at<double>(i, 0) = pts[i].x;
data_pts.at<double>(i, 1) = pts[i].y;
//Perform PCA analysis
PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW);
//Store the position of the object
Point pos = Point(pca_analysis.mean.at<double>(0, 0),
pca_analysis.mean.at<double>(0, 1));
//Store the eigenvalues and eigenvectors
vector<Point2d> eigen_vecs(2);
vector<double> eigen_val(2);
for (int i = 0; i < 2; ++i)
eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0),
pca_analysis.eigenvectors.at<double>(i, 1));
eigen_val[i] = pca_analysis.eigenvalues.at<double>(i);
// Draw the principal components
circle(img, pos, 3, CV_RGB(255, 0, 255), 2);
line(img, pos, pos + 0.02 * Point(eigen_vecs[0].x * eigen_val[0], eigen_vecs[0].y * eigen_val[0]) , CV_RGB(255, 255, 0));
line(img, pos, pos + 0.02 * Point(eigen_vecs[1].x * eigen_val[1], eigen_vecs[1].y * eigen_val[1]) , CV_RGB(0, 255, 255));
return atan2(eigen_vecs[0].y, eigen_vecs[0].x);
int main()
// Read the image
Mat bw, img = imread("pca_test1.jpg",1); // "pca_test2.jpg"
// Convert it to greyscale
cvtColor(img, bw, COLOR_BGR2GRAY);
// Apply thresholding
threshold(bw, bw, 150, 255, cv::THRESH_BINARY);
// Find all objects of interest
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(bw, contours, hierarchy, cv::RETR_LIST, cv::CHAIN_APPROX_NONE);
// For each object
for (size_t i = 0; i < contours.size(); ++i)
// Calculate its area
double area = contourArea(contours[i]);
// Ignore if too small or too large
if (area < 1e2 || 1e5 < area) continue;
// Draw the contour
drawContours(img, contours, i, CV_RGB(255, 0, 0), 2, 8, hierarchy, 0);
// Get the object orientation
getOrientation(contours[i], img);
imshow("Image", img);
char key;
while (true)
key = waitKey(1);
if (key == 'q') break;
cv::destroyAllWindows();
return 0;
【讨论】:
你的opencv版本是什么?我仍然收到有关内存地址的错误。我认为是我机器的问题。我将尝试将其转换为 java。你有参考吗?顺便说一句,谢谢你 我的OpenCV版本是2.4.6,win 7 x64,编译器是vs2010。项目和 OpenCV Dll 都是 x64 的。 我知道这可能太多了,但你能用java转换你的代码吗?谢谢 我不是 java 专家。我才开始为 android 编程 :)以上是关于OPENCV:image_proc 中的 PCA 应用程序错误的主要内容,如果未能解决你的问题,请参考以下文章
opencv中“单通道灰度图”怎么转成cvMat类型,我是要做PCA的,求大牛解答。。。
OpenCV 例程300篇234. 特征提取之主成分分析(PCA)