안녕하세요 요몇일 계속 혼자 해보려다가 너무 힘들어서 질문글을 올리게되었어요 ㅠㅠ <div><br></div> <div>잘봐주시면 감사하겠습니다 (__)</div> <div><br></div> <div>코드 자체는 어렵지않습니다.(영상처리 부분을 연습하던중 인터넷에서 특정색을 가리는 것을 가져온코드입니다.)</div> <div>코드을 그냥 올리면 글이 가독성이떨어져서 꼬릿말에 올려두었습니다.</div> <div>혹시 코드에 문제가있다면 말씀해주세요 ㅎㅎ</div> <div><br></div> <div>문제가되는 에러는 _crtisvalidheappointer(puserdata) 라는 에러문구입니다.</div> <div>중단점을 트리거했다면서 debug assertion Failed! 하며 띄웁니다.</div> <div>그런데 다시시도를 하고 계속을 눌러주면 결국 원하는 결과를 얻을 수 있긴 합니다.(?)</div> <div><br></div> <div>하지만 에러를 고치지 않으면 다른데 코드를 쓰지 못하겠더라구요 ㅠㅠ</div> <div><br></div> <div>인터넷에서 주로 dll에서 alloc한것을 스스로 푸는경우에도 생긴다고하고 (저같은경우 main code에 free가 없어서 이건아닌것같지만,,ㅎㅎ)</div> <div>windows에서 잘못한것이라는 문구도 많습니다.</div> <div><br></div> <div><br></div> <div><br></div> <div>인터넷에 나와있는 해결방법중</div> <div><br></div> <div>프로젝트 속성-구성속성-일반-MFC사용-> 공유 DLL에서 MFC사용</div> <div><br></div> <div>프로젝트 속성-구성속성-C/C++-코드생성-런타임라이브러리->다중 스레드 DLL(?MD)</div> <div><br></div> <div><div><br></div> <div>[Properties] -> [Linker] -> [Input] -> [Additional Dependencies]</div> <div><span style="font-size:9pt;line-height:1.5;">nochkclr.obj는 제거, msvcrt.lib는 추가</span></div> <div><br></div> <div>[Properties] -> [Linker] -> [Input] -> [Force Symbol References]</div> <div>__DllMainCRTStartup@12 추가</div> <div><br></div> <div>[Properties] -> [Linker] -> [Command Line] -> [Additional options]</div> <div>/NOENTRY 추가</div></div> <div><br></div> <div>정도를 다해봤는데 도저히 고쳐질 기미가 보이질않습니다... 일부는 그냥 현상태가 유지되고 일부는 빌드가 안되게 막히더라구요,.,,</div> <div><br></div> <div><br></div> <div><br></div> <div>아 프로그래밍환경은 VISUAL STUDIO 2013, opencv 2410버젼을 쓰고있습니다!</div> <div><br></div>
#include "stdafx.h"
/*#include "opencv\highgui.h"
#include "opencv\cv.h"
#include <opencv2\opencv.hpp>*/
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <vector>
void detectHScolor(const cv::Mat& image, double minHue, double maxHue, double minSat, double maxSat, cv::Mat& mask){
cv::Mat hsv;
cv::cvtColor(image, hsv, CV_BGR2HSV);
std::vector<cv::Mat> channels;
cv::split(hsv, channels);//HSV 채널분리
//Hue 마스크 0~255
cv::Mat mask1;
cv::threshold(channels[0], mask1, maxHue, 255, cv::THRESH_BINARY_INV);
cv::Mat mask2;
cv::threshold(channels[0], mask2, minHue, 255, cv::THRESH_BINARY);
cv::Mat hueMask;
if (minHue < maxHue) hueMask = mask1 & mask2;
else hueMask = mask1 | mask2;
cv::threshold(channels[1], mask1, maxSat, 255, cv::THRESH_BINARY_INV);
cv::threshold(channels[1], mask1, minSat, 255, cv::THRESH_BINARY);
cv::Mat satMask;
satMask = mask1 & mask2;
//풍선영역만카피
mask = hueMask & satMask;
mask = ~mask;
}
int main(){
cv::Mat image = cv::imread("C:\\opencv\\images\\wave.jpg");
cv::Mat mask;
detectHScolor(image, 70, 210, 10, 255, mask);
//Hue 범위 100~150 Sat범위 15~255 마스크생성
cv::Mat detected(image.size(), CV_8UC3, cv::Scalar(0, 0, 0));
image.copyTo(detected, mask);
//마스크를 원본벡터에 투과걸러냄
cv::namedWindow("image");
cv::imshow("Image", image);
cv::namedWindow("Mask");
cv::imshow("Mask", mask);
cv::namedWindow("Detected");
cv::imshow("Detected", detected);
cv::waitKey(0);
}
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.