❶ 關於C語言利用openCV顯示圖片的問題
這個程序我這運行沒問題的,是原始圖像尺寸顯示(vs2012+opencv2.3.1),不清楚你的具體情況,程序裡面第二句pImg我復制出來的時候有錯誤,是大寫的i和小寫的L很像造成的;
❷ opencv讀取圖片顯示不出來
都已經提示讀圖片失敗了,src = cvLoadImage("lina.jpg");應該是這句話那個圖片的路徑有問題,寫個絕對路徑吧。如x:xxx/xxxx/xxxx/lina.jpg。或者將lina.jpg放在debug或者release的路徑下
❸ opencv測試不顯示圖片
結果可以顯示
你嘗試把你的opencv裡面的opencv_world320.dll文件所在的目錄」opencvuildx64vc14in」中的所有文件拷貝到「c:windowssystem32」目錄下。看清自己的系統是32還是64。64放在systemWOw中
或者你看看網頁鏈接解決的是無法查找或打開 PDB 文件的問題。 希望對你有幫助。共同學習
❹ opencv安裝後想測試顯示圖片程序,參數設置都沒問題,編譯也通過,但debug後就顯示這個,高手們幫幫忙謝啦
程序沒經過測試,不過先發表一下言論。程序在進入主函數以後就進入if語句,這時候argc是否等於1,如果不等於1,那函數就直接返回-1了,你把if條件之前加上argc=1;再編譯看看。好像還有C++中 的路徑好像用的是雙斜杠的吧?
❺ OpenCV測試案例運行時不顯示圖片,只顯示窗口
應該是顯示的機制問題。我也遇到過,可以這樣,直接把src在寫到文件裡面cvSaveImage(''')應該是正常的。
直接用ipython,opencv來操作吧,很方便。
❻ visual stdio中配置opencv之後輸入程序(讀取並顯示圖片)為什麼我讀入大尺寸圖片的時候只能顯示一部分
用opencv顯示圖片和直接打開查看圖片不一樣。opencv默認直接用100%顯示圖片。如果圖片過大,屏幕無法完全顯示很正常。你可以多加一段修改大圖像尺寸的代碼
❼ opencv如何讀入圖片
1、首先新建一個VC++控制台項目如下圖所示。本文項目名稱helloOpenCV。
4、在主文件中添加如下代碼:
#include "stdafx.h"
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
const char* imagename = "emosue.jpg";
//從文件中讀入圖像
Mat img = imread(imagename);
//如果讀入圖像失敗
if(img.empty())
{
fprintf(stderr, "Can not load image %s
", imagename);
return -1;
}
//顯示圖像
imshow("image", img);
//此函數等待按鍵,按鍵盤任意鍵就返回
waitKey();
return 0;
❽ 如何在使用OpenCV warpPerspective時顯示整個圖像
第一步,這副圖片是我們將要用來顯示的圖片,利用opencv提取該照片的灰度值,然後將該照片的灰度值顯示出來
第二步,將相關庫文件庫加進去,包括利用opencv顯示的庫,特別是黃色圈中的部分,如下圖所示
第三步,先要讀入圖片文件的地址,我將文件放在工程目錄下,所以地址如下所示,然後將讀入的地址給MAT類,讀兩次,一次給灰度圖像用,另一次給彩色圖像用,下面用一個IF不判斷出錯的處理情況
步驟閱讀
4
第四步,按下圖所示創建顯示窗口,前面參數是窗口名,後面的1表示圖像不可縮放,創建一個灰度窗口和一個彩色窗口
5
第五步,將圖像在創建的窗口中顯示,第一參數是顯示的窗口名,第二個參數是我們先讀入的MAT圖像,後面是按鍵返回
6
第六步,按上述代碼完成後,成功顯示圖像如下所
❾ mfc中使用opencv顯示圖片並釋放內存
前一天把系統整個重寫了一遍,脈絡清晰了很多,也終於解決了以前很多崩潰,異常退出的問題。這里小小總結一下自己遇到的麻煩。
1、內存泄露
內存泄露是說沒有釋放已經不能使用的內存,這里一般指堆的內存才需要顯示的釋放。比如用malloc,calloc,realloc,new分配的內存是在堆上的,需要用free,delete顯示的回收。內存泄露最明顯的一是程序很慢,在運行程序時你可以啟動任務管理器,會看到程序佔用的內存一直「砰砰砰」的往上漲:
最後直接崩潰,或者你關閉程序的時候也會異常退出,出現
Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
之類的問題。
除了new的對象我們知道要delete。OpenCV中使用cvCreateImage()新建一個IplImage*,以及使用cvCreateMat()新建一個CvMat*,都需要cvReleaseImage() cvReleaseMat()顯示的釋放
[cpp] view plainprint?IplImage* subImg=cvCreateImage( cvSize((img->width)*scale,(img->height)*scale), 8, 3 );
CvMat *tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scale,CV_MAKETYPE(image->depth,image->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);
IplImage* subImg=cvCreateImage( cvSize((img->width)*scale,(img->height)*scale), 8, 3 );
CvMat *tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scale,CV_MAKETYPE(image->depth,image->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);另外一些函數要用到 CvSeq*來存放結果(通常這些都要用cvCreateMemStorage()事先分配一塊內存CvMemStorage*),都要是釋放掉相應的內存,這是很難找的。
比如從二值圖像中尋找輪廓的函數cvFindContours():
[cpp] view plainprint?CvMemStorage* m_storage=cvCreateMemStorage(0);
CvSeq * m_contour=0;
cvFindContours( img, m_storage, &m_contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
//釋放內存
cvReleaseMemStorage(&m_storage);
CvMemStorage* m_storage=cvCreateMemStorage(0);
CvSeq * m_contour=0;
cvFindContours( img, m_storage, &m_contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
//釋放內存
cvReleaseMemStorage(&m_storage);
以及人臉識別中檢測人臉的函數:
[cpp] view plainprint?CvMemStorage* m_storage=cvCreateMemStorage(0);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
CvSeq* faces = cvHaarDetectObjects( img, cascade, m_storage,1.1, 2, 0,cvSize(30, 30) );
//釋放內存
cvReleaseMemStorage( &faces->storage);
( &cascade );
CvMemStorage* m_storage=cvCreateMemStorage(0);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
CvSeq* faces = cvHaarDetectObjects( img, cascade, m_storage,1.1, 2, 0,cvSize(30, 30) );
//釋放內存
cvReleaseMemStorage( &faces->storage);
( &cascade );
注意這里我們可以使用
cvReleaseMemStorage( &faces->storage);
來釋放m_storate,也可以使用:
cvReleaseMemStorage(&m_storage);
釋放內存,這是等效的,但一定不要用兩次!!
2、一塊內存多次釋放
對應沒有釋放內存,對應就是一個內存釋放多次,如同上面的 cvReleaseMemStorage用了兩次。可能報錯的地方:
[cpp] view plainprint?__declspec(noinline)
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
/* assign 0 to _debugger_hook_mmy so that the function is not folded in retail */
(_Reserved);
_debugger_hook_mmy = 0;
}
__declspec(noinline)
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
/* assign 0 to _debugger_hook_mmy so that the function is not folded in retail */
(_Reserved);
_debugger_hook_mmy = 0;
}或者: Unhandled exception at XXXXXXXXXX in XXX.exe: XXXXXXXXXXX: 堆已損壞。
除了上述的MemStorge問題,使用cvQueryFrame()取出CvCapture*每幀圖像,只需在最後釋放CvCapture*,不需要釋放IplImage*
[cpp] view plainprint?CvCapture* pCapture = cvCreateCameraCapture(-1);
IplImage* pFrame=cvQueryFrame( pCapture );
cvReleaseCapture(&pCapture);
CvCapture* pCapture = cvCreateCameraCapture(-1);
IplImage* pFrame=cvQueryFrame( pCapture );
cvReleaseCapture(&pCapture);
*這篇是以前寫的,其實還是建議大家用C++介面的OpenCV,內存問題很少了~