最近剛接觸使用opencv做人臉識別,剛想做一個小實踐的時候總是程式報錯,使用的是其他人正確運行過的代碼,但還是一直報錯,希望能夠得到各位有經驗的大神的幫助,謝謝大家啦

本來是想用攝像頭采集影像,遇到報錯后換了一個簡單的例子,但是還是報錯……為了保證代碼的完整性所以保留了注釋掉的部分
報錯資訊如下:
“FaceDemo1.exe”(Win32): 已加載“C:\Program Files (x86)\Intel\OpenCL SDK\1.5\bin\x86\intelocl.dll”。無法查找或打開 PDB 檔案。
“FaceDemo1.exe”(Win32): 已卸載“C:\Program Files (x86)\Intel\OpenCL SDK\1.5\bin\x86\intelocl.dll”
Critical error detected c0000374
FaceDemo1.exe 已觸發了一個斷點。
0x00007FFE3037E6FC (ntdll.dll)處(位于 FaceDemo1.exe 中)引發的例外: 0xC0000374: 堆已損壞。 (引數: 0x00007FFE303D22B0)。
0x00007FFE3037E6FC (ntdll.dll) (FaceDemo1.exe 中)處有未經處理的例外: 0xC0000374: 堆已損壞。 (引數: 0x00007FFE303D22B0)。
兩個程式的報錯位置都是在“detectMultiScale”處,看到網上有人說這個報錯是地址越界,但我也不知道該修改哪里,希望能夠得到各位大神的幫助。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
string haar_face_datapath = "G:/opencv3.4.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt_tree.xml";
int main(int argc, char** argv) {
/*VideoCapture capture(0); // 打開攝像頭
if (!capture.isOpened()) {
printf("could not open camera...\n");
return -1;
}
Size S = Size((int)capture.get(CV_CAP_PROP_FRAME_WIDTH), (int)capture.get(CV_CAP_PROP_FRAME_HEIGHT));
int fps = capture.get(CV_CAP_PROP_FPS);
*/
CascadeClassifier faceDetector;
faceDetector.load(haar_face_datapath);//加載檢測器
/*Mat frame;
namedWindow("camera-demo", CV_WINDOW_AUTOSIZE);
vector<Rect> faces;
int count = 0;
while (capture.read(frame)) {
flip(frame, frame, 1);//影像左右翻轉
faceDetector.detectMultiScale(frame, faces, 1.1, 1, 0, Size(100, 120), Size(380, 400));
for (int i = 0; i < faces.size(); i++) {
if (count % 10 == 0) {
Mat dst;
resize(frame(faces[i]), dst, Size(100, 100));
imwrite(format("D:/MyFaces/face_%d.jpg", count), dst);
}
rectangle(frame, faces[i], Scalar(0, 0, 255), 2, 8, 0);
}
imshow("camera-demo", frame);
char c = waitKey(10);
if (c == 27) {
break;
}
count++;
}
capture.release();
*/
Mat srcImage, grayImage, dstImage;
// 【2】讀取圖片
srcImage = imread("D:/123.jpg");
dstImage = srcImage.clone();
imshow("【原圖】", srcImage);
grayImage.create(srcImage.size(), srcImage.type());
cvtColor(srcImage, grayImage, CV_BGR2GRAY); // 生成灰度圖,提高檢測效率
Scalar colors[] =
{
// 紅橙黃綠青藍紫
CV_RGB(255, 0, 0),
CV_RGB(255, 97, 0),
CV_RGB(255, 255, 0),
CV_RGB(0, 255, 0),
CV_RGB(0, 255, 255),
CV_RGB(0, 0, 255),
CV_RGB(160, 32, 240)
};
// 【3】檢測
vector<Rect> rect;
faceDetector.detectMultiScale(grayImage, rect, 1.1, 3, 0); // 分類器物件呼叫
printf("檢測到人臉個數:%d\n", rect.size());
// 【4】標記--在臉部畫圓
for (int i = 0; i < rect.size(); i++)
{
Point center;
int radius;
center.x = cvRound((rect[i].x + rect[i].width * 0.5));
center.y = cvRound((rect[i].y + rect[i].height * 0.5));
radius = cvRound((rect[i].width + rect[i].height) * 0.25);
circle(dstImage, center, radius, colors[i % 7], 2);
}
// 【5】顯示
imshow("【人臉識別detectMultiScale】", dstImage);
waitKey(0);
return 0;
}
uj5u.com熱心網友回復:
faceDetector.load(haar_face_datapath);//這里加載成功了嗎?bool ok = faceDetector.load(haar_face_datapath);
printf("%d", ok);
assert(!ok); //檢查一下是否加載成功
uj5u.com熱心網友回復:
謝謝回復!我把這段代碼加上了,輸出OK的值是1,但是assert不可用,運行時報錯,所以我把這個assert注釋了,留下輸出ok的陳述句,顯示ok值為1

uj5u.com熱心網友回復:
代碼看不啥問題,你重新下載一個64位的opencv SDK試試,有可能是64位機呼叫32位的DLL出問題了uj5u.com熱心網友回復:
嗯嗯,我去試試,謝謝你~
uj5u.com熱心網友回復:
已解決這個問題,解決方法如下:1.我使用“debug”+“x64”版本進行開發,所以在這個版本下的屬性中“聯結器--》輸入--》附加依賴項”中,應選填每一項中有“d”的,如:“opencv_world340.lib”和“opencv_world340d.lib”,不填“opencv_world340.lib”而選擇帶有“d”的。
2.在使用imshow之前要先使用namedWindow函式創建視窗,不然就會報以上的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108710.html
標籤:C++ 語言
上一篇:查看自己的CSDN ID是多少
下一篇:keil c99支持
